爬虫基础

2024-07-27 10:33:05 浏览数 (1)

请求网页的方法

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代替

0 人点赞