(一)实现爬虫的简单思路

文章目录

(一)写爬虫的一些套路

1. 准备url

1.1 准备start_url

(1) url地址规律不明显,或总数不确定时
李毅贴吧,点击下一页时,对应的url地址的pn会增加50,但不确定李毅吧的总数是多少,故需要准备start_url
start_url = https://tieba.baidu.com/f?kw={}&ie=utf-8&pn={}
使用 start_url.format 对{}进行替换,实现动态更换页码

(2)通过代码提取下一页的url
1)xpath(重点)
xpath("//a[text()='下一页']/@href")  直接获取到下一页的url地址
图中可以看到下一页的url地址对应的pn=100,即第三页

在这里插入图片描述

2)寻找url地址,部分参数在当前的响应中,比如,当前页码和总的页码数在当前的响应中
可以看到每次请求的数量为count=18 总数total=1015 
故代码中 需要获取total,然后用一个num来记录一共请求的数量(num+=18)
根据 num<total 进入循环,当num>=total时,则循环结束,所有的页面都被抓取下来。

在这里插入图片描述

1.2 准备 url_list

(1) 页码总数明确
(2)url地址规律明显
举一个栗子 糗事百科
url_temp = https://www.qiushibaike.com/text/page/{}/
url_list = url.temp.format(i) for i in range(1,14)
这样可以拿到糗事百科所有的链接组成的列表
for url in url_list   就可以拿到每一个url地址

在这里插入图片描述

2. 发送请求,获取响应

1.requests.get(url,headers,params,proxies,auth,,cookie..)
params : 将参数放在url中传递,可以使用params
	比如    kw = {'wd':'长城'}   requests.get("https://www.baidu.com/s?",headers= headers,params=kw) 相当于请求https://www.baidu.com/s?wd='长城'
proxies :添加代理ip
	比如:proxies={'http':"http://12.34.56.79:9527",
	                     "https":"https://12.34.56.79:9527"}
	           requests.get(url,headers=headers,proxies=proxies)
auth:账户密码登录
	比如:auth={"test","123465"}
	requests.get(url,headers=headers,auth=auth)
cookie:添加cookie
	比如:
	test.txt 里面直接放有  
		__cur_art_index=1600; _ga=GA1.2.97777798.1555168736; _gid=GA1.2.607144467.1555168736; Hm_lvt_18a964a3eb14176db6e70f1dd0a3e557=1555168894; _xsrf=2|71c6fa81|71d328e36d68bb652ab98854a1f2be71|1555203682; Hm_lvt_2670efbdd59c7e3ed3749b458cafaa37=1555168705,1555203878; Hm_lpvt_2670efbdd59c7e3ed3749b458cafaa37=1555203878
		
	f=open(r'test.txt','r')#打开所保存的cookies内容文件
	cookies={}#初始化cookies字典变量
	for line in f.read().split(';'):   #按照字符:进行划分读取
 	#其设置为1就会把字符串拆分成2份
	name,value=line.strip().split('=',1)
	cookies[name]=value  #为字典cookies添加内容
	
	然后requests.get(url,cookies=cookies) 就是添加了cookies

cookie={__cur_art_index=1600; _ga=GA1.2.97777798.1555168736; _gid=GA1.2.607144467.1555168736; Hm_lvt_18a964a3eb14176db6e70f1dd0a3e557=1555168894; _xsrf=2|71c6fa81|71d328e36d68bb652ab98854a1f2be71|1555203682; Hm_lvt_2670efbdd59c7e3ed3749b458cafaa37=1555168705,1555203878; Hm_lpvt_2670efbdd59c7e3ed3749b458cafaa37=1555203878}

2.requests.post(url,data)
data 里面可以添加 很多信息,它相当于一个字典,里面可以放有很多的参数(比如headers,代理等),然后一起发送请求。

2.1 添加随机的User-Agent,反反爬虫

使用chrome 抓包工具就可以拿到我们当前浏览器所对应的User-Agent
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"}

在这里插入图片描述

2.2 添加随机的代理Ip,反反爬虫

proxies :添加代理ip
	比如:proxies={'http':"http://12.34.56.79:9527",
	                     "https":"https://12.34.56.79:9527"}
	           requests.get(url,headers=headers,proxies=proxies)

2.3 在对方判断出我们是爬虫之后,应该添加更多的headers字段,包括cookie

test.txt 里面直接放有  
		__cur_art_index=1600; _ga=GA1.2.97777798.1555168736; _gid=GA1.2.607144467.1555168736; Hm_lvt_18a964a3eb14176db6e70f1dd0a3e557=1555168894; _xsrf=2|71c6fa81|71d328e36d68bb652ab98854a1f2be71|1555203682; Hm_lvt_2670efbdd59c7e3ed3749b458cafaa37=1555168705,1555203878; Hm_lpvt_2670efbdd59c7e3ed3749b458cafaa37=1555203878
		
	f=open(r'test.txt','r')#打开所保存的cookies内容文件
	cookies={}#初始化cookies字典变量
	for line in f.read().split(';'):   #按照字符:进行划分读取
 	#其设置为1就会把字符串拆分成2份
	name,value=line.strip().split('=',1)
	cookies[name]=value  #为字典cookies添加内容
	
	然后requests.get(url,cookies=cookies) 就是添加了cookies

2.4 cookie的处理可以使用session来解决

ssion = requests.session()
session.get(url,headers,..)

2.5 准备一堆能用的cookie,组成cookie池

(1)不需要登录的情况
1)准备刚开始能够成功请求对方网站的cookie,即接收对方网站设置在response的cookie
2)下一次请求的时候,使用之前的列表中的cookie来请求
(2)需要登录的情况
1)准备多个账号
2)使用程序获取每个账号的cookie
3)之后请求登录之后才能访问的网站随机的选择cookie

3. 提取数据

3.1 确定数据的位置

(1)如果数据在当前的url地址中
1)提取的是列表页的数据
① 直接请求列表页的url地址,不用进入详情页
即你需要的数据的,比如内容,标题信息都在当前列表页能够获取到
2)提取的是详情页的数据
即你需要的数据,比如图片等信息被放在了详情页,你想同时获取列表页的标题信息和详情页的图片信息,则需要以下几个步骤。
① 确定url
② 发送请求
③ 提取数据
④ 返回
(2)如果数据不在当前的url地址中
1)在其他的响应中,寻找数据的位置
① 从network中从上往下找
② 使用chrome中的过滤条件,选择出了js,css,img之外的按钮
③ 使用chrome的search all file,搜索数字和英文,(中文有可能会给转码,有些时候不能直接搜索到中文)

3.2 数据的提取(重点考虑xpath)

(1)xpath,从html中提取整块的数据,先分组,之后每一组再提取
举个例子  糗事百科
获取当前页面所有的div列表  content_list =  html.xpath("//div[@id='content-left']/div")
for div in content_list:  #依次遍历
    item={} # 置空一个字典
    item["content"] = div.xpath(.//div[@class='content']/span/text()") # 获取文字
    item["num"]=div.xpath(".//div[@class='stats-vote']/i/text()") # 获取数量
    item["num"]=item["num"][0] if len(item["num"])>0 else None # 判断数量是否为空,若为空则定义为None 可防止顺序错乱
    content_list.append(item) #追加到一个列表当中

在这里插入图片描述
在这里插入图片描述

(2)re(正则表达式),提取max_time,price,html中的json字符串
(3)json

4. 保存

4.1 保存在本地,text,json,csv

以json文件为例  
with open("qiushi.json","a",encoding="utf-8") as f:
	for content in content_list:# content_list是承接上面数据提取所得到的一个数据列表,遍历这个数据列表
			f.write(json.dumps(content,ensure_ascii=False,indent=2))# 写入到数据列表中,json.dumps可以将python对象转换为json,ensure_ascii = False 目的是为了取消默认编码为ascii,indent =2 是让保存在txt文件的数据,以两个空格的进行缩进
			f.print("\n")
这样的话将所有的数据块都保存在了qiushi.json中

4.2 保存在数据库 mysql,MongoDB,Redis

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值