今天就带大家一起认识一下爬虫!
第一步:获取:网页的信息
1.最简单的直接获取
我们通过最简单的python代码来获取百度首页的网页代码!http://www.baidu.com
import requests
response = requests.get('https://www.baidu.com')
html= response.text
print(response.request.headers)
print(response.text)
结果如下
我可以观察到:
{‘User-Agent’: ‘python-requests/2.21.0’, ‘Accept-Encoding’: ‘gzip, deflate’, ‘Accept’: ‘/’, ‘Connection’: ‘keep-alive’}
用户的headers显示是python-requests/2.21.0
那么这就是第一个反爬机制
2.直接爬取被headers反爬机制所阻止
在遇到有一些对headers进行限制的网页时,我们可以通过改变headers来进行获取。
比如,爬取图片的时候,对于某个图片网址,我们通过1.来进行获取时获取不到的,会被拒绝。
可以看到爬取的网页代码主体是乱码的
并且还会问你是机器人吗?还说会调查你的浏览器!确保不是恶意攻击!
爬取其实和floods网络攻击有相似之处
3.更改headers来进行反反爬
import requests
headers={
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.47'
}
response = requests.get('https://www.vmgirls.com/12234.html',headers=headers)
html= response.text
print(response.request.headers)
print(response.text)
爬取到了正常的网页代码!
如果获得这个headers呢?
以百度网页为例子
按F12进入工作台,很神奇吧!
百度的首页按F12进入后还可以看到校园招聘的信息!
诗写的不错呢!
crtl+shift+I也可以打开,换着用!
我在这个界面上刷新一次,就会出现网页所需要的图片,json文件等的内容,我们点开第一个文件
哇!我们看到一个新世界,让我们康康有没有user-agent的信息呢!
这里的user-agent就是容许访问的user-agent,我们伪装成这个就可以了啊!太棒了!
可能遇到的困难
有的网页,比如这个唯美图片网页啊,它不让用快捷键打开工作台,我们可以从旁边的三个小点进入工作台,但是进入工作台后,网页会自动跳转,这个反爬机制就有点意思了。
但是完全不会妨碍我们获得网页的信息的!
因为就我个人观察,所有的网页的user-agent都是一样的0.0
那么,也就是说,对于或者所有的网页信息都可以直接使用这种改变headers的方式进行爬取。
那么,我们还需要用到工作台吗?
当然,工作台能够帮助我们更快的查询到网页的元素代码所在位置!
下面让我们马上进入网页解析部分
第二步:解析网页
一般要先找到网页的元素相关代码
但是对于唯美图片网页啊,前面说了用不了工作台,直接把爬出来的网页代码打出来,自己来找
# 这里的html是前面爬取的网页内容
import re
import os
dir_name = re.findall('<h1 class="post-title h1">(.*?)</h1>',html)[-1]
if not os.path.exists(dir_name):
os.mkdir(dir_name)
urls =re.findall('<a href="(.*?)" alt=".*?" title=".*?">',html)
print(urls)
print(dir_name)
第三步:保存图片
import time
for url in urls:
time.sleep(1) #设置休眠1s一次,不然给人家网站爬崩了
file_name = url.split('/')[-1] # 找到图片名字
print(file_name)
url="https:"+url #上次解析爬出来的信息是没有https;头的,我们进行拼接
response = requests.get(url,headers=headers) # 找到对应的图片
# print(response.content)
with open(dir_name +'/'+file_name,'wb') as f:
f.write(response.content) #把图片写入文件夹
从爬一个网站扩展到多个网站
把前面的爬取定义为一个函数
def get_pic(path):
headers={
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.47'
}
response = requests.get(path,headers=headers)
html= response.text
dir_name = re.findall('<h1 class="post-title h1">(.*?)</h1>',html)[-1]
if not os.path.exists(dir_name):
os.mkdir(dir_name)
urls =re.findall('<a href="(.*?)" alt=".*?" title=".*?">',html)
# print(urls)
print(dir_name)
for url in urls:
time.sleep(0)
file_name = url.split('/')[-1]
print(file_name)
url="https:"+url
response = requests.get(url,headers=headers)
# print(response.content)
with open(dir_name +'/'+file_name,'wb') as f:
f.write(response.content)
主函数,将爬取的网页用for循环拼接
注意:这里要写一个异常捕获,这个网站没有就抛出!不然爬取的时候会断掉
# 12230---13000
import requests
import re
import os
import time
i=12230
while i<13000:
i+=1
try:
paths='https://www.vmgirls.com/'+str(i)+'.html'
get_pic(paths)
print("************************"+i)
except:
print("************************"+i)