爬虫基础知识
一、Scrapy
1、cookie设置
目前cookie的设置不支持在headers进行设置, 需要通过以下三种方式进行设置:
第一种:setting文件中设置cookie
- 当
COOKIES_ENABLED
是注释的时候,scrapy默认没有开启cookie。 - 当
COOKIES_ENABLED
没有注释设置为False的时候,scrapy默认使用了settings里面的cookie。 - 当
COOKIES_ENABLED
设置为True的时候,scrapy就会把settings的cookie关掉,使用自定义cookie。
注意:
- 当使用settings的cookie的时候,又把
COOKIES_ENABLED
设置为True,scrapy就会把settings的cookie关闭,而且也没使用自定义的cookie,会导致整个请求没有cookie,导致获取数据失败。- 如果使用自定义cookie就把
COOKIES_ENABLED
设置为True- 如果使用settings的cookie就把
COOKIES_ENABLED
设置为False
第二种:middlewares中设置cookie
在middlewares中的downloadermiddleware中的process_request中配置cookie,配置如下:
request.cookies=
{'Hm_lvt_a448cb27ae2acb9cdb5f92e1f0b454f3': '1665643660',
' _ga': 'GA1.1.755852642.1665643660'
}
注意:cookie内容要以键值对的形式存在
第三种:在spider爬虫主文件中,重写start_request方法,在scrapy的Request函数的参数中传递cookies
重载start_requests方法
def start_requests(self):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) Gecko/20100101 Firefox/44.0"
}
# 指定cookies
cookies =
{
'Hm_lvt_a448cb27ae2acb9cdb5f92e1f0b454f3': '1665643660',
' _ga': 'GA1.1.755852642.1665643660'
}
2、Get请求带参数
yield scrapy.FormRequest(
url=url,
method='GET',
formdata=params,
callback=self.parse_result
)
3、 meta拷贝
scrapy中的yield scrapy.Request 在传递item 的注意点
在需要多次调用下面这个parse() 方法的时候,会出现获取到最后一个meta的情况,而且是循环调用最后一个,就像yield 这一部分是个for循环,但是下面的parse方法不再循环内,所以就只能一直调用到最后一个meta. 这是时候需要deepcopy(meta)
4、start_requests或者start_urls多个请求只请求第一个
默认情况下,scrapy防止重复请求。由于在起始url中只有参数不同,scrapy会将起始url中的其余url视为第一个url的重复请求。这就是为什么你的蜘蛛在获取第一个url后停止。为了解析其余的url,我们在scrapy请求中启用了dont_filter标志。
修改前:
def start_requests(self):
for i in range(10):
yield scrapy.Request('https://baidu.com', self.parse, meta={"seq": i})
修改后:
def start_requests(self):
for i in range(10):
yield scrapy.Request('https://baidu.com', self.parse, meta={"seq": i}, dont_filter=True)
参考资料
https://www.jianshu.com/p/de3e0ed0c26b