下一节介绍正常request携带cookie爬取并保存到数据库
本次介绍scrapy+selenium爬虫以及正常request爬虫,并且分别保存到sqlite数据库和mysql数据库
Scrapy 是用 Python 实现的一个为了爬取网站数据、提取结构性数据而编写的应用框架。
Scrapy 常应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。
通常我们可以很简单的通过 Scrapy 框架实现一个爬虫,抓取指定网站的内容或图片。
在本次案例中,我们通过scrapy调用selenium进行爬虫
pip安装并且启动第一个项目
pip install Scrapy
scrapy startproject pinglun
自动生成如下结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FouOGy27-1668689368756)(C:/Users/86180/AppData/Roaming/Typora/typora-user-images/image-20221117203114617.png)]
其中大多数文件就是他的名字的功能,middlware就是中间件(爬虫过程),pipline就是管道(可以理解为数据从这儿流过),settings主要是全局的配置,items进行一些条件的限制(比如限制爬取字段),本次我们直接爬虫,就不做限制了
自定义文件carhome.py,核心代码如下
import scrapy
from copy import deepcopy
import time
class CarhomeSpider(scrapy.Spider):
num=1
#cookie是浏览器的身份证,通过cookie对招聘官网进行反反爬虫
cookies=" Hm_lvt_194df3105ad7148dcf2b98a91b5e727a=1648874337; __g=-; wt2=DWoUozbY57pwOIbymK4RzESIa5cnHAkMCG3lvevHp0gcQ4OqHMygNu3V_f8rIKNOusm7DKDVBnRLt0i3E5A-kIg~~; __l=l=%2Fwww.zhipin.com%2Fweb%2Fgeek%2Frecommend&s=3&friend_source=0; lastCity=100010000; __c=1648874338; __a=37977466.1648874338..1648874338.6.1.6.6; Hm_lpvt_194df3105ad7148dcf2b98a91b5e727a=1648874430; __zp_stoken__=b67adMTN2O0tzWXpEEH9KSSE7dWcteiA1TF03KAczH0o7PXk1IlBiRUxcezJNZA0NHiYJIiA%2FOi8vYSQEUmAHDgU0HEg2QzQvbgYMS3NoRntFQR1KAV1fDwkebwVHUHgWXB87ViBEUFhtXSU%3D"
cookies = {i.split("=")[0]: i.split("=")[1] for i in cookies.split(";")}
#下面属于scrapy自动生成的数据
name = 'carhome'
allowed_domains = ['zhipin.com/']
base_html='https://www.xxxx.com'
start_urls = ['https://www.xxxx.com/job_detail/?query=大数据开发工程师&city=100010000&industry=&position=']
two_urls="https://www.xxxx.com/c100010000/?query={}&page={}"
def parse(self,response):
#搜索数据和数据页码的切换
list= ["大数据开发工程师", "大数据工程师", "大数据讲师", "大数据运维工程师"]
for i in list:
for page in range(1,10):
two_url = self.two_urls.format(i,page)
time.sleep(0.2)
#上面为页码对应的网页,对前十页进行网页申请,通过parse_two函数进行网页处理
yield scrapy.Request(
url=two_url,
cookies=self.cookies,
dont_filter=True,
callback=self.parse_two
)
def parse_two(self,response):
print("正在爬取网页: ")
print(response)
item={}
#对数据列表进行定位
uls=response.xpath("//div[@class='job-box']/div[@class='job-list']/ul/li")
# 对数据进行定位,然后进行数据的储存
for li in uls:
item["name"]=li.xpath('.//span[@class="job-name"]/a/@title').extract()[0]
item["salary"]=li.xpath('.//div[@class="job-limit clearfix"]/span/text()').extract()[0]
item["detail"]=li.xpath('.//div[@class="job-title"]//a/@href').extract()[0]
item["city"]=li.xpath('.//div[@class="job-title"]/span[@class="job-area-wrapper"]/span/text()').extract()[0]
#跳转到详细页面
time.sleep(0.2)
yield scrapy.Request(
url=self.base_html+item["detail"],
cookies=self.cookies,
dont_filter=True,
meta={'item': deepcopy(item)},
callback=self.parse_t
)
def parse_t(self,response):
item = response.meta.get("item")
item["detail_text"]=response.xpath(".//div[@class='job-sec']/div/text()").extract()
print("爬取ing,第{}个页面".format(self.num))
self.num+=1
yield item
本次使用selenium进行爬虫,所以对中间件middlware进行修改,使用selenium为爬虫引擎
class CookiesMiddlewares(object):
def __init__(self):
print("初始化浏览器")
self.driver = webdriver.Chrome()
def process_request(self, request, spider):
self.driver.get(request.url)
time.sleep(4)
# 我们等待5秒钟,让其加载
source = self.driver.page_source
# 获取页面的源码
response = HtmlResponse(url=self.driver.current_url, body=source, request=request, encoding='utf-8')
# Response 对象用来描述一个HTTP响应
return response
# 这样我们就获取到了所有的信息,并返回response
但是记得我们修改middleware,需要对settings进行修改中间件
DOWNLOADER_MIDDLEWARES = {
'pinglun.middlewares.CookiesMiddlewares': 543,
}
这样我们就可以进行数据的爬取了
但是数据爬取之后,还需要保存数据
pipline中增加如下内容
class PinglunPipeline:
def process_item(self, item, spider):
with open(r'xxx.csv', mode='a', encoding='utf-8') as f:
file = f"{item['name']},{item['city'][0:2]},{item['salary']},{item['detail_text']}\n"
f.write(file)
return item
同样的,只要是对全局的影响,都需要再settings进行修改/增加,修改如下内容
ITEM_PIPELINES = {
'pinglun.pipelines.PinglunPipeline': 300,
}
这样本次爬虫就完成了,但是相对来说,各部分都是入门基础的,数据的保存也比较粗糙
学习就是这样,我们一开始有自己对知识应用的的一些理解,在学到别人指导后恍然大悟原来还能这样呀,所以,循序渐进,并且多尝试做到,再想如何做的更好,才能学好所学的内容
本次整理了此前另一个爬虫爬取的一万四千条招聘数据的数据爬虫,需要的人链接自取
本文做过敏感处理,需要详情代码欢迎上述自取