请求网页的方法
requests
包中的get方法,用来请求网页
代码语言:python代码运行次数:0复制import requests
payload={'key1':'value1','key2'='value2'}
dat=requests.get('http://www.example.com',params=payload)#params参数收集传入是不定个数的参数,并将收集的到参数以元组的方式存储在params中,如果没有传入参数params就是个空元组
print(dat.url)
设置请求时间,避免程序一直与服务器连接。相关程序如下所示,设置超时时间为0.01s,超过这个时间就会自动断开,同时程序报错。
代码语言:python代码运行次数:0复制#在0.01s设置等待时间,如果超过0.01s就会断开并报错
dat=requests.get('http://www.github.com',timeout=0.001)
查看服务器返回内容,直接打印text格式的response即可。
代码语言:python代码运行次数:0复制#将返回的response对象打印出来,查看内容
import requests
dat=requests.get('http://api.github.com/events')
dat.text
requests库相关介绍
Requests 会自动解码来自服务器的内容。大多数 unicode 字符集都能被无缝地解码。请求发出后,Requests 会基于 HTTP 头部对响应的编码作出有根据的推测。当你访问 r.text 之时,Requests 会使用其推测的文本编码。你可以找出 Requests 使用了什么编码,并且能够使用 r.encoding 属性来改变它.
但是Requests库的自身编码为: r.encoding = ‘ISO-8859-1’ ,可以 r.encoding 修改编码,代码如下,修改为国际通用的UTF-8:
代码语言:python代码运行次数:0复制url='http://music.baidu.com'
r=requests.get(url)
r.encoding='utf-8'
print(r.text)
当发起一个请求,requests会根据http的header进行编码
代码语言:python代码运行次数:0复制import requests
dat=requests.get('http://baidu.com') # dat.encoding 'ISO-8859-1'
dat.encoding='utf-8'#可以进行修改
post方法
一般post方法用于浏览器端给服务器端上传数据,如果使用post方法多次上传多数据,可用下面相关代码:
代码语言:python代码运行次数:0复制import requests
payload={'key1':'value1','key2':'value2'}#payload=(('key1','value1'),('key1','value2'))//如果一个key对应多个值
dat=requests.post('http://httpbin.org/post',params=payload)#这个网址可以将传递的参数返回
print(dat.text)
代理IP
现在许多网站都有反爬机制,其中就有针对单一IP一次请求过于频繁采取封禁的机制,一般我们解决这种方法可以采用代理IP池,每次请求都用不同的IP发出,避免单一IP被检测。使用代理IP代码如下:
代码语言:python代码运行次数:0复制# 使用代理IP,防止爬虫被ban
import requests
proxies={
'http':'http://10.10.1.10:3128',
'https':'https://10.10.1.10:1080',
}
# proxies={
# 'http':'http://user:pass@10.10.1.10:3128',
# }将用户名与密码写入
dat=requests.get('http://example.org')
但其实也不一定用这个就是为了反爬,而是针对一些需要代理的情况。我们一些地区的IP无法直接访问,第三方软件开启后,需要通过对应的端口,程序里就可以用这个。
查找与定位数据
BeautifulSoup在爬取过程中能快速定位到元素并提取数据,BeautifulSoup要获取某条数据首先要得到它的标签,然后找到这条标签里可以用来定位的属性,例如:class、id等。
Selenium是一个在网页上使用的自动化测试工具,可以将JS渲染出来。
下面的代码,Selenium只会寻找第一个匹配该属性的元素并返回,没有会报错:
代码语言:python代码运行次数:0复制driver.find_element_by_tag_name('form')#利用tag标签定位,eg.<form></form>
Selenium还可以用xpath:可以匹配出所有符合条件元素,且定位到上一层或其他层
driver.find_element_by_xpath()
shift 鼠标右键,并在右键菜单中单击以此进入cmd控制台。
启动与关闭虚拟环境
代码语言:bash复制C:Usersyezhoubing>d:
D:>cd D:virtualenvENVScripts
D:virtualenvENVScripts>activate
extract
extract():这个方法返回的是一个数组list,,里面包含了多个string,如果只有一个string,则返回'ABC'这样的形式。extract_first():这个方法返回的是一个string字符串,是list数组里面的第一个字符串。相关内容如下:
代码语言:bash复制>>> response.xpath('//title/text()').extract_first()
'Scrapy | A Fast and Powerful Scraping and Web Crawling Framework'
>>> fetch("http://www.baidu.com")
2020-12-28 20:49:36 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://www.baidu.com> (referer: None)
>>> response.xpath('//title/text()').extract
<bound method SelectorList.getall of [<Selector xpath='//title/text()' data='百度一下,你就知道'>]>
本地html文件处理
代码语言:python代码运行次数:0复制#用BeautifulSoup寻找本地html文件内容
from bs4 import BeautifulSoup
file=open("./test.html","rb")#以二进制读的方式打开相对路径下文件
test=file.read()
file.close()
bs=BeautifulSoup(test,"html.parser")#用html解析内容
print(bs.title)
print(bs.title.string)#用string可以只打印标签内的内容
print(type(bs.title.string))#NavigableString 标签里的内容(字符串)
print(bs.tr)#标签及其内容,但默认找到它的第一个内容
print(type(bs.p))
print(type(bs))#BeautifulSoup表示整个文档
print(bs)
代码语言:python代码运行次数:0复制print(bs.a.string)
print(type(bs.a.string))#Comment 是一个特殊的NavigableString,输出的内容不包含注释符号
文档遍历
代码语言:python代码运行次数:0复制#文档的遍历
print(bs.tr.contents)#多个内容会输出n,内容以列表的形式存储
print(bs.tr.contents[1])#可以以列表输出的方式输出
文档搜索
按标签搜索
代码语言:python代码运行次数:0复制tr_list=bs.find_all("tr")#find_all()查询所有,在这里是tr标签(字符串过滤:会查找与字符串完全匹配的内容)
print(tr_list)#以,间隔
#正则表达式搜索:使用search()方法来匹配内容(注意一下grouop错误)
按正则搜索
代码语言:python代码运行次数:0复制#正则表达式搜索:使用search()方法来匹配内容
tr_list=bs.find_all(re.compile("tr"))#只要有tr就被找到,不唯一
print(tr_list)
按参数搜索
代码语言:python代码运行次数:0复制#参数搜索
tr_list=bs.find_all(id="head")#id为head元素被找到
tr_list=bs.find_all(class_=True)#只要有class就被找到
代码语言:python代码运行次数:0复制#text参数搜索
tr_list=bs.find_all(text="123")#文本为123
tr_list=bs.find_all(text=["123","di"])#文本为123、di
代码语言:python代码运行次数:0复制#limit参数搜索
tr_list=bs.find_all("tr",limit=2)#只要前两个tr
print(tr_list)
按css选择器搜索
代码语言:python代码运行次数:0复制#css选择器
tr_list=bs.select("title")#找到title标签元素,以列表方式cun'chu
tr_list=bs.select(".mnav")#找到有mnav类元素(css中.表示类名)
tr_list=bs.select("#mnav")#找到有mnav id元素(css中#表示id名)
tr_list=bs.select("a[class='bri']")#找到有bri类名的a标签,通过属性查找
tr_list=bs.select("head>title")#找到有head下title元素,子标签
tr_list=bs.select(".mnav~.bri")#找到有与mnav同级的bri类,兄弟标签
print(tr_list)
print(tr_list[0].get_text())#打印文本内容
利用正则校验内容
通常我们需要在一个字符串中校验是否符合我们制定的规则,比如输入邮箱号是否有@,手机号是否为11位等,下面给出正则校验的相关代码:
代码语言:python代码运行次数:0复制import re
pat=re.compile("AA")#此处的AA,是正则表达式,用来验证其他的字符串
m=pat.search("ADSAA")#search字符串被校验的内容
print(m)
#输出结果为span(3,5)而且只会匹配第一个AA
代码语言:python代码运行次数:0复制import re
m=re.search("asd","Aasd")#前面的字符串是规则(模版),后面的是被校验的对象
print(m)
代码语言:python代码运行次数:0复制import re
print(re.findall("[A-Z]","AFDShgcdSVXF"))#找到后面字符串中的所有大写字母
代码语言:python代码运行次数:0复制import re
print(re.sub("a","A","AAAFDAaaa"))#在字符串中用的a用A代替