1.运用scrapy写爬虫
①创建scrapy目录
②设置setting
③写items
④写爬虫
scrapy.Request()参数:
url: 需要请求,并进行下一步处理的url
callback: 指定该请求返回的Response,由那个函数来处理。
method: 一般不需要指定,使用默认GET方法请求即可
headers: 请求时,包含的头文件。一般不需要。
Host: media.readthedocs.org
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0
Accept: text/css,/;q=0.1
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://scrapy-chs.readthedocs.org/zh_CN/0.24/
Cookie: _ga=GA1.2.1612165614.1415584110;
Connection: keep-alive
If-Modified-Since: Mon, 25 Aug 2014 21:59:35 GMT
Cache-Control: max-age=0
meta: 在不同的请求之间传递数据使用的。字典dict型
request_with_cookies = Request(url=“http://www.example.com”,
cookies={‘currency’: ‘USD’, ‘country’: ‘UY’},
meta={‘dont_merge_cookies’: True})
encoding: 使用默认的 ‘utf-8’ 就行。
dont_filter: indicates that this request should not be filtered by the scheduler.
This is used when you want to perform an identical request multiple times,
to ignore the duplicates filter. Use it with care, or you will get into crawling loops.
Default to False.
errback: 指定错误处理函数
2.scrapy中异步加载的处理
①分析页面是否为异步加载,打印源码
通常使用requests抓取页面的时候,得到的html源码可能和在浏览器中看到的不一样,在页面上则可以看到数据。
这是因为数据是听过ajax异步加载的,原始页面不会包含某些数据,原始页面加载完之后,会向服务区请求某个接口获取数据,然后数据才会被呈现在页面上,这其实就是发送了一个ajax请求。
②如果不是,用Xpath解析
③如果是,进一步分析,解析json,然后再解析数据
可在代码中模拟页面上的url,header,param,请求方式等信息来发送请求,来请求服务器接口来获取所需信息。
如果有翻页的话,参数中应该也有page参数,可以通过range函数循环页码把所所需的页的信息抓取出来。
然后通过解析json数据,一层一层取值,一一对应,在解析函数的最后要yield item
3.用scrapy存储数据到MySQL
存储item[‘example’]到对应表的对应列
4.scrapy运行脚本
from scrapy import cmdline
cmdline.execute(‘scrapy crawl shanxi’.split())
5.遇到问题
①
存库时注意替换数据中的一些字符,可能由于中文英文差异造成的字符问题,从而影响程序的运行和数据的储存。
②
在pipelines中,分别把key和value对应存到MySQL列中,遍历字典,代码如下:
#product_attr
for key, value in item[‘value’].items():
sql2 = “INSERT INTO product_attr(product_id,attr_first,attr_second,value) VALUES (%s,%s,%s,%s)”
value2 = (item[‘product_id’], ‘规格参数’, key, value)
self.cursor.execute(sql2, value2)
self.connect.commit()
6.总结
①初步理解了scrapy的流程以及运用
②知道了异步加载如何处理,不像以前一样毫无头绪
③原url+params 进入显示页面
④理解了生成器的作用和意义
⑤meta传参
⑥callback回调
延伸知识点:
①
response.text 与 response.content的区别:
response.text 返回Unicode型的文本数据 → 文本
response.content 返回bytes型的二进制数据 → 文件,图片 (一般打印源码用content)
response.content.decode(“utf8”) 修改网页编码方式
②
json.load()和json.loads()的区别
load:针对文件句柄,将json格式的字符转换为dict,从文件中读取 (将string转换为dict)
loads:针对内存对象,将string转换为dict (将string转换为dict) → 多用于解析异步加载