irpas技术客

python-scrapy(爬虫框架)_yzhSWJ_爬虫项目命名

irpas 4565

(1)scrapy是什么? Scrapy 是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理 或存储历史数据等一系列的程序中 # (1) pip install scrapy # (2) 报错1: building 'twisted.test.raiser' extension # error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ # Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools # 解决1 # http://·/price/brand-15.html'] # 注意如果你的请求的接口是html为结尾的 那么是不需要加/的 start_urls = ['https://car.autohome.com.cn/price/brand-15.html'] def parse(self, response): name_list = response.xpath('//div[@class="main-title"]/a/text()') price_list = response.xpath('//div[@class="main-lever"]//span/span/text()') for i in range(len(name_list)): name = name_list[i].extract() price = price_list[i].extract() print(name, price)

scrapy组织架构

?scrapy工作原理

?scrapy Shell(调试使用) 1.什么是scrapy shell? Scrapy 终端,是一个交互终端,供您在未启动 spider 的情况下尝试及调试您的爬取代码。 其本意是用来测试提取 数据的代码,不过您可以将其作为正常的Python 终端,在上面测试任何的 Python 代码。 该终端是用来测试XPath 或 CSS 表达式,查看他们的工作方式及从爬取的网页中提取的数据。 在编写您的 spider 时,该 终端提供了交互性测试您的表达式代码的功能,免去了每次修改后运行spider 的麻烦。 一旦熟悉了Scrapy 终端后,您会发现其在开发和调试 spider 时发挥的巨大作用。

?

2.安装ipython 安装: pip install ipython 简介:如果您安装了 IPython , Scrapy 终端将使用 IPython ( 替代标准 Python 终端 ) 。 IPython 终端与其他相 比更为强大,提供智能的自动补全,高亮输出,及其他特性。 使用 # 进入到scrapy shell的终端 直接在window的终端中输入scrapy shell 域名 # 如果想看到一些高亮 或者 自动补全 那么可以安装ipython pip install ipython # scrapy shell ·

?demo

?

yield 1. 带有 yield 的函数不再是一个普通函数,而是一个生成器 generator ,可用于迭代 2. yield 是一个类似 return 的关键字,迭代一次遇到 yield 时就返回 yield 后面 ( 右边 ) 的值。重点是:下一次迭代 时,从上一次迭代遇到的yield 后面的代码 ( 下一行 ) 开始执行 3. 简要理解: yield 就是 return 返回一个值,并且记住这个返回的位置,下次迭代就从这个位置后 ( 下一行 ) 开始 案例: 1. 当当网 (1) yield (2) . 管道封装(3) . 多条管道下载 (4)多页数据下载 2.电影天堂 (1)一个 item 包含多级页面的数据 1.自定义核心文件 import scrapy # 不要看他报错,不影响下面调用方法 # 导入 scrapy_dangdang_095 下面的items # from scrapy_dangdang_095.items import ScrapyDangdang095Item # 解决导入函数报错 from ..items import ScrapyDangdang095Item class DangSpider(scrapy.Spider): name = 'dang' # 如果是多页下载的话 那么必须要调整的是allowed_domains的范围 一般情况下只写域名 allowed_domains = ['category.dangdang.com'] start_urls = ['http://category.dangdang.com/cp01.01.02.00.00.00.html'] base_url = 'http://category.dangdang.com/pg' page = 1 def parse(self, response): # pipelines 下载数据 # items 定义数据结构的 # src = //ul[@id="component_59"]/li//img/@src # alt = //ul[@id="component_59"]/li//img/@alt # price = //ul[@id="component_59"]/li//p[@class="price"]/span[1]/text() # 所有的seletor的对象 都可以再次调用xpath方法 li_list = response.xpath('//ul[@id="component_59"]/li') for li in li_list: # 此处 图片是懒加载 所以获取的不是src src = li.xpath('.//img/@data-original').extract_first() # 第一张图片和其他的图片的标签的属性是不一样的 # 第一张图片的src是可以使用的 其他的图片的地址是data-original # 第一张 返回的是None if src: src = src else: src = li.xpath('.//img/@src').extract_first() name = li.xpath('.//img/@alt').extract_first() price = li.xpath('.//p[@class="price"]/span[1]/text()').extract_first() book = ScrapyDangdang095Item(src=src, name=name, price=price) # 获取一个book就将book交给pipelines yield book # 每一页的爬取的业务逻辑全都是一样的,所以我们只需要将执行的那个页的请求再次调用parse方法 # 就可以了 # http://category.dangdang.com/pg2-cp01.01.02.00.00.00.html # http://category.dangdang.com/pg3-cp01.01.02.00.00.00.html # http://category.dangdang.com/pg4-cp01.01.02.00.00.00.html if self.page < 100: self.page = self.page + 1 url = self.base_url + str(self.page) + '-cp01.01.02.00.00.00.html' # 怎么去调用parse方法 # scrapy.Request就是scrpay的get请求 # url就是请求地址 # callback是你要执行的那个函数 注意不需要加() yield scrapy.Request(url=url, callback=self.parse) 2.配置items要爬取的数据 # Define here the models for your scraped items # # See documentation in: # https://docs.scrapy.org/en/latest/topics/items.html import scrapy class ScrapyDangdang095Item(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() # 通俗的说就是你要下载的数据都有什么 # 图片 src = scrapy.Field() # 名字 name = scrapy.Field() # 价格 price = scrapy.Field() 3.使用管道 pipelines # Define your item pipelines here # # Don't forget to add your pipeline to the ITEM_PIPELINES setting # See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html # useful for handling different item types with a single interface from itemadapter import ItemAdapter # 如果想使用管道的话 那么就必须在settings中开启管道 class ScrapyDangdang095Pipeline: # 在爬虫文件开始的之前就执行的一个方法 def open_spider(self, spider): self.fp = open('book.json', 'w', encoding='utf-8') # item就是yield后面的book对象 def process_item(self, item, spider): # 以下这种模式不推荐 因为每传递过来一个对象 那么就打开一次文件 对文件的操作过于频繁 # # (1) write方法必须要写一个字符串 而不能是其他的对象 # # (2) w模式 会每一个对象都打开一次文件 覆盖之前的内容 # with open('book.json','a',encoding='utf-8')as fp: # fp.write(str(item)) # 请使用此方法 self.fp.write(str(item)) return item # 在爬虫文件执行完之后 执行的方法 def close_spider(self, spider): self.fp.close() import urllib.request # 多条管道开启,下载图片 # (1) 定义管道类 # (2) 在settings中开启管道 # 'scrapy_dangdang_095.pipelines.DangDangDownloadPipeline':301 class DangDangDownloadPipeline: def process_item(self, item, spider): url = 'http:' + item.get('src') filename = './books/' + item.get('name') + '.jpg' urllib.request.urlretrieve(url=url, filename=filename) return item

注意:要是用pipelines 要在settings 中开启

?获取列表和详情

?详情地址

?

import scrapy from ..items import ScrapyMovie099Item class MvSpider(scrapy.Spider): name = 'mv' allowed_domains = ['· demo

自定义核心文件

import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule from ..items import ScrapyReadbook101Item class ReadSpider(CrawlSpider): name = 'read' allowed_domains = ['·'] # 注意第一页的数据1188_1 中的_1 不要漏掉 start_urls = ['https://·/book/1188_1.html'] # allow 提取页面符合要求所有连接 # follow=True 如果是false 只会获取当前显示页的所有数据 13 页 # follow=True 会获取全部页数据 rules = ( Rule(LinkExtractor(allow=r'/book/1188_\d+.html'), callback='parse_item', follow=True), ) def parse_item(self, response): img_list = response.xpath('//div[@class="bookslist"]//img') for img in img_list: name = img.xpath('./@data-original').extract_first() src = img.xpath('./@alt').extract_first() book = ScrapyReadbook101Item(name=name,src=src) yield book 将查询的数据存入数据库中 需要安装? pymysql 包 pymysql 的使用步骤 1.pip install pymysql 2.pymysql.connect(host,port,user,password,db,charset) 3.conn.cursor() 4.cursor.execute() 2.setting配置mysql信息/以及新建通道

?3.通道pipelines # Define your item pipelines here # # Don't forget to add your pipeline to the ITEM_PIPELINES setting # See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html # useful for handling different item types with a single interface from itemadapter import ItemAdapter class ScrapyReadbook101Pipeline: def open_spider(self, spider): self.fp = open('book.json', 'w', encoding='utf-8') def process_item(self, item, spider): self.fp.write(str(item)) return item def close_spider(self, spider): self.fp.close() # 加载settings文件 from scrapy.utils.project import get_project_settings import pymysql class MysqlPipeline: def open_spider(self, spider): settings = get_project_settings() self.host = settings['DB_HOST'] self.port = settings['DB_PORT'] self.user = settings['DB_USER'] self.password = settings['DB_PASSWROD'] self.name = settings['DB_NAME'] self.charset = settings['DB_CHARSET'] self.connect() def connect(self): self.conn = pymysql.connect( host=self.host, port=self.port, user=self.user, password=self.password, db=self.name, charset=self.charset ) self.cursor = self.conn.cursor() def process_item(self, item, spider): sql = 'insert into book(name,src) values("{}","{}")'.format(item['name'], item['src']) # 执行sql语句 self.cursor.execute(sql) # 提交 self.conn.commit() return item def close_spider(self, spider): self.cursor.close() self.conn.close() 日志信息和日志等级

?

?scrapy的post请求

?自定义核心文件 import scrapy import json class TestpostSpider(scrapy.Spider): name = 'testpost' allowed_domains = ['https://fanyi.baidu.com/sug'] # post请求 如果没有参数 那么这个请求将没有任何意义 # 所以start_urls 也没有用了 # parse方法也没有用了 # start_urls = ['https://fanyi.baidu.com/sug/'] # # def parse(self, response): # pass def start_requests(self): url = 'https://fanyi.baidu.com/sug' data = { 'kw': 'final' } yield scrapy.FormRequest(url=url, formdata=data, callback=self.parse_second) def parse_second(self, response): content = response.text # json 不需要 ,encoding='utf-8' obj = json.loads(content) print(obj) 代理

?


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #爬虫项目命名 #1scrapy是什么 #可以应用在包括数据挖掘信息处理 #或存储历史数据等一系列的程序中 #1 #pip