#cmd中: #(1)创建目录E:\pycharm>scrapy startproject pachong ( 在当前目录中创建中创建一个pachong项目文件) #(2)E:\pycharm>cd pachong(转换路径) #(3)E:\pycharm\pachong>scrapy genspider chouti chouti.com( 创建爬虫应用) #(4)打开xhouti.py进行编辑 #(5)scrapy list(展示爬虫应用列表) #(6)E:\pycharm\pachong>scrapy crawl chouti --nolog(运行单独chouti爬虫应用)
import scrapy import sys import io from scrapy.selector import Selector sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding="utf-8") #改变标准输出的默认编码,该语句修改了python的默认编码为utf8,并赋予了我们的stdout输出,使得python的输出默认编码为utf8, class ChoutiSpider(scrapy.Spider): name = 'chouti' allowed_domains = ['chouti.com'] start_urls = ['http://dig.chouti.com/'] def parse(self, response): # print(response.url) # print(response.text) # content = str(response.body,encoding="utf-8") # print(content) #找到文档中所有的A标签 # hxs = Selector(response=response).xpath('//a') #标签对象列表 # for obj in hxs: # print(obj) #标签对象 # hxs = Selector(response=response).xpath('//div[@data-id="28100251"]/div[@class="link-area clearfix"]').extract() #对象转换为字符串 # for i in hxs: # print(hxs) hxs = Selector(response=response).xpath('//div[@data-id="28100251"]/div[@class="link-area clearfix"]') #html的目录 for obj in hxs: a=obj.xpath('.//a[@class="link-title link-statistics"]/text()').extract_first() #返回的是列表,只拿列表中的第一个 print(a.strip()) #a.strip的意思是去掉空白1.什么是XPath? XPath使用路径表达式在XML文档中进行导航 XPath包含一个标准函数库 XPath是SXLT中的主要元素,是一个W3C标准 2.字符表示 // 表示子孙 .// 当前对象的子孙 / 儿子 /div 儿子中的div标签 /div[@id=“i1”] 儿子中的div标签且div=i1 obj.extract() 列表中的每一个对象转换为字符串 obj.extract_first() 列表中的每一个对象转换为字符串,并返回列表中的第一个元素 //div/text() 获取某个标签的文本 3.parse方法 parse(self,response):当请求url返回网页没有指定回调函数,默认的Request对象的回调函数,用来处理网页返回的response,和生成的Item或者Request对象 (1)因为使用的yield,而不是return,parse函数将会当做一个生成器使用,scrapy会注意调用parse方法中生成的结果,并且判断该结果是一个什么样的类型。 (2)如果是request则会加入爬取队列中,如果是item类型则会使用pipeline处理,其他类型则会返回错误信息。 (3)scrapy取到第一部分的request不会立马就去发送request,只是将这个request放到队列中,然后接着从生成器中获取。 (4)取完了第一部分的request,然后再获取第二部分的item,取到item了,就会放到对应的pipeline中处理。 (5)parse方法作为回调函数(callback),赋值给Request,指定parse()方法处理这些请求scrapy.Request(url,callback=self.parse)。 (6)Request对象经过调度,执行生成scrapy.http.response()响应对象,并送回parse()方法,直到调度器中没有Requset(递归的思路)。 (7)取尽之后,parse()工作结束,引擎再根据对列和pipeline中的内容去执行相应的操作。 (8)程序在取得各个页面的items前,会先处理完之前所有的request对列的请求,然后再提取items。 原文链接:https://blog.csdn.net/qq_42281826/article/details/81017402 4.注意 (1)一定要在settings.py中设置 ROBOTSTXT_OBEY = False (2)sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding=“utf-8”) 改变标准输出的默认编码,该语句修改了python的默认编码为utf-8,并赋予了stdout输出,使得python的输出默认编码为utf-8,否则会在cmd中出现乱码的情况。