作用:自动化脚本、辅助工作,提高工作效率吧
分类:网络爬虫(公开)、蠕虫爬虫(病毒)
工作流程:
进阶:
第三方框架安装:
用于模拟浏览器,发送请求,提交数据,获取返回数据
http中的请求函数:
response_get = requests.get('http://httpbin.org/get')#官方网站,可用于测试
response_post = requests.post('http://httpbin.org/post')
运行没有报错,则证明请求成功。
服务器接口(url),两种请求方式的提交参数
参数名要和实际的相符合
response_get = requests.get(‘http://httpbin.org/get’,params={‘user’:‘Mr.L’})
response_post = requests.post(‘http://httpbin.org/post’,data={‘user’:‘Mr.L’})
请求对象(提交参数) - 服务器 - 返回对象(返回信息)
print(response_get.url)
print(response_post.url)
结果:
http://httpbin.org/get?user=Mr.L
http://httpbin.org/post
服务器返回状态码:
网页编码格式:
#向百度发起请求
response_get = requests.get('https://www.baidu.com')
print('code-',response_get.status_code)
print('encoding-',response_get.encoding)
结果:
code- 200 #表示请求成功
encoding- ISO-8859-1 #表示使用的网页编码格式
返回数据类型:
结构:
服务器会客户端验证,验证一些浏览器隐藏提交的参数
在开发者模式下,network网络,可以抓取当前访问的url,显示访问信息,F5刷新
Name中第一个-General-Status Code显示访问呢状态
response_get =
requests.get('http://www.qianlima.com/zb/area_305',headers=head)
print('code-',response_get.status_code)
该代码的结果是403,也就说无法正常访问
学习伪装,寻找request headers内部的参数,复制之后用于定制头部
常用的:User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36(用户代理)
解释:
head = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'}
response_get = requests.get('http://www.qianlima.com/zb/area_305',headers=head)
print('code-',response_get.status_code)
#这样之后,运行结果就是200,那么代表伪装成功
浏览器的本地缓存
获取cookie:
response_get = requests.get(url='http://httpbin.org/cookies')
print('cookie-',response_get.cookies)
提交cookie:
cookie = {'name':'jack'}
response_get = requests.get(url='http://httpbin.org/cookies',cookies=cookie)
print('cookie-',response_get.text)
一台主机与另一台主机链接,代理完成任务
高可用IP:https://ip.jiangxianli.com/
pro = {
‘http://’:‘37.238.209.227:80’,
‘https://’:‘110.232.252.234:8080’
}
http、https找各自对应的IP端口
访问服务器时链接时间默认60s,超出时间抛出异常
timeout 重置链接时间
try:
response_get = requests.get(url='http://httpbin.org/cookies',timeout=0.05)#出现异常
except Exception as e:#解决异常
print(e)
方便解析html、xml等格式的源码,方便快速查询、修改等操作,节省开发时间
官网文档:
https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/
导入包:from bs4 import BeautifulSoup
html_doc = '是谁送你来到我身边 百度阿里是风
'
html.parser
html5lib
要确保有以上的环境
soup = BeautifulSoup(html_doc,‘html5lib’)
print(soup.title)-----------------------读取标题
Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种: Tag , NavigableString , BeautifulSoup , Comment .
如果查询的标签不存在
存在Tag,不存在None
soup.TagName 查询该页面中第一次出现的标签,只获取一个标签
print(soup.head)
print(soup.p)
可以通过.string|.text获取标签内部的文本
string 如果是一个子节点,输出该内容,如果多个子节点,无法确定,所以输出None
text 可以获取该标签下所有子节点的文本
#只显示文本内容
print(soup.title.string)
print(soup.p.text)
可以通过.attrs查看标签的属性集合{}结构,可以使用字典的方式获取属性的值
print(soup.a.attrs)
print(soup.a.attrs['id'])
print(soup.a.get('id'))
可以通过查询函数获取单个及多个满足条件的标签
a_list = soup.find_all(name='a')
print(a_list)
a_list = soup.find_all(name=['a','p'])
print(a_list)
a_list = soup.find_all(name='a',attrs={'class':'ali'})
print(a_list)
a_list = soup.find_all(name='a',limit=1)
print(a_list)
a = soup.find(name='a',attrs={'class':'ali'})
print(a)
a_list = soup.select("a")
print(a_list)
a_list = soup.select("a#baidu")
print(a_list)
a_list = soup.select("a.ali")
print(a_list)
a_list = soup.select("body #baidu")
print(a_list)
https://www.feizhuip.com/?source=baidu&keyword=feizhudailiip
思路:
1.访问Page1,获取代理IP的标签模块,解析出代理IPPage2页面的url
2.访问Page2,获取代理IP的信息表格模块,解析数据,本地存储
import requests
from bs4 import BeautifulSoup
class SpiderFeiZhuApp:
'''初始化函数'''
def __init__(self):
self.url = 'https://www.feizhuip.com/?source=baidu&keyword=feizhudailiip'
self.head = {'user-agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'}
self.resp = ''
self.href_list = []
pass
'''请求页面一'''
def sendPage1(self):
# 1 发起请求
self.resp = requests.get(url=self.url,headers=self.head)
# 2 验证请求
print('code-',self.resp.status_code)
# 3 解析网页源码
soup = BeautifulSoup(self.resp.text,'html5lib')
# 4 获取网页标题
title = soup.title.string
print('title-',title)
# 5 查询标签:find_all(div class:item)
div_list = soup.find_all(name='div',attrs={'class':'info'})
span_list = div_list[2].select('p.list span.date')
a_list = div_list[2].select('p.list a.content')
print('len-',len(div_list),len(span_list),len(a_list))
# 6 获取page1中的文本和page2的url
for i in range(0,len(span_list)):
href = a_list[i].attrs['href']
text = a_list[i].string
date = span_list[i].string
# 7 判断内容不能为None
if href != None and text != None and date != None:
# 8 剔除空格
href = href.strip()
text = text.strip()
date = date.strip()
# 9 路径缺失域名
if 'http' not in href:
href = 'https://www.feizhuip.com/' + href
# 10 保存到列表:[{date:date},{},{},{}]
self.href_list.append({'date':date,'title':text,'href':href})
print('page1-info ',self.href_list)
'''请求页面二'''
def sendPage2(self):
pass
'''本地存储'''
def saveTxt(self):
pass
def run(self):
self.sendPage1()
app = SpiderFeiZhuApp()
app.run()