scrapy

爬取网站之前

1、我需要爬取哪些信息,数据是否可以通过预设的几个网站来获取,需要发现那些我不知道的网站吗
2、当爬虫爬取到某个网站时,是跳转到新网站还是留在当前网站深入抓取内容
3、有没有我不需要爬取的网站信息,比如英文网站
4、如果我的网络爬虫引起了某个网站管理员的怀疑,我如何避免承担法律责任?

需要确定爬取的字段有哪些

1、当设计爬虫程序时,先确定自己需要哪些数据,而不是网站有哪些数据
2、这个信息可以帮助项目实现目标吗?如果我不包括该信息,是否会造成阻碍?还是说该信息有了固然好,但是并不会影响任何结果?
3、如果该信息将来可能有帮助,但是我并不确定,那么晚些时候再抓取会有多大的困难?
4、这个数据对于我已经抓取的信息来说是否冗余?
5、将数据存储在这个对象中是否符合逻辑?

如果爬取到了这些数据,当存储的时候需要考虑

1、该数据是稀疏的还是密集的?它与每个清单都相关并且会出现在其中,还是只与部分清单相关?
2、该数据有多大?
3、在数据较大的情况下,我每次运行分析时都需要检索该数据,还是只是偶尔需要使用该数据?
4、这种类型的数据有多大的变化性?我需要经常加入新的属性、修改类型吗?还是说该数据一直保持不变?

创建爬虫

创建项目scrapy startproject name
创建爬虫,需要先到项目下的spider文件夹中, scrapy genspider name url

setting配置文件

DOWNLOAD_DELAY = [0, 2]可以设置爬虫的随机访问延迟

管道

专门用来持久化存储数据的,在spider中通过yield语法来把数据传入到管道,前提是要在settings中开启管道

spider请求

GET: scrapy.Request(url=url, callback=下一个函数, meta={传值到下一个函数})
POST: scrapy.FormRequest(url=url, callback=下一个函数,meta={传值到下一个函数},formdata=提交的数据)

请求与响应

请求: 爬虫向某个url发起的,可以携带数据发送
响应: 服务器接收到请求之后返回给爬虫的数据

获取xpath数据

response包含了响应相关的所有数据
response.xpath('xapth语法').extract()可以获取到通过xpath定位的数据,如果没有数据则会返回none
同时还有getall()可以获取选取的所有标签的数据
extract_first()如果获取到了多个数据,这个函数只会选取第一个数据
xpath语法的text()可以写成这种形式text()[1]表示获取到的文本的第一个数据

爬虫文件中定义爬取数据的规则

这个设置规则会自动获取start_urls中的url中所有的连接,通过规则来匹配需要进行处理的url
对于这个规则爬虫来说,是没有post请求这一说的,可以通过保存url再使用普通爬虫来获取数据
from scrapy.spiders import Rule, CrawlSpider
from scrapy.linkextractors import LinkExtractor
定义规则需要使爬虫继承CrawlSpider
使用类中的rules参数来定义回调的每一个url的规则, 可以是列表或元组
rules = [Rule(LinkExtractor(allow="规则"), callback="回调函数"), follow=布尔值]
follow来设置是否继续获取当前url的存在连接

问题集

一般来说会重写start_request(self)方法,定义第一次访问网页的方式
在管道中写入json文件时,如果字典转换乱码的话则需要在dumps参数中加入ensure_ascii=False就不会乱码了
在使用pymysql连接mysql的时候,默认的字符集是mysql中配置的字符集,如果需要设置则在连接的时候加入charset="utf-8"即可
posted @ 2021-09-24 15:45  耿集  阅读(64)  评论(0)    收藏  举报