day20-python-spider
day20-python-spider
spider
简介
网络爬虫又称网络蜘蛛、网络机器人,他是一种按照一定的规则自动浏览、检索网页信息的程序或者脚本。网络爬虫能够自动请求网页,并将所需要的数据抓取下来。通过对抓取的数据进行处理,从而提取出有价值的信息。
爬虫分类
- 通用网络爬虫
- 聚焦网络爬虫
- 增量式网络爬虫
urllib库
爬虫库,获取网页的信息
常用方法
- urlopen()
urllib.request.urlopen(url,timeout)
url:要爬取的网页地址
timeout:等待超时时间,超过此时间抛出异常
- Request()
urllib.request.Request(url,headers)
Request():对请求对象的封装
url:请求的url
headers:请求头的封装
- http的响应对象
response.read() :读取响应的内容
response.read().decode():以指定的编码进行解码后读取响应的内容
response.url():获取url地址
response.getcode():获取请求时http的响应码
User-Agent
用户代理
User-Agent 即用户代理,简称“UA”,它是一个特殊字符串头。网站服务器通过识别 “UA”来确定用户所使用的操作系统版本、CPU 类型、浏览器版本等信息。
- 作用
反扒策略
网站通过识别请求头中 User-Agent 信息来判断是否是爬虫访问网站。
如果是,网站首先对该 IP 进行预警,对其进行重点监控,当发现该 IP 超过规定时间内的访问次数, 将在一段时间内禁止其再次访问网站。
自定义UA代理池
模块随机获取UA
from fake_useragen import UserAgent
- 使用
# 导入模块
from fake_useragen import UserAgent
ua=UserAgent()
# 随机获取一个ie
headers=ua.ie
# 随机获取一个火狐
headers=ua.firefox
爬虫实例--以类的方式
# 爬虫
import random
import time
import urllib
from urllib import parse
from urllib import request
from ua_info import ua_list
class MySpider(object):
url = ""
# 初始化url的信息
def __init__(self):
self.url = 'https://tieba.baidu.com/f?{}'
# 获取一个指定url的信息
def getUrlInfo(self, url):
headers = {
"User-Agent": random.choice(ua_list)
}
# 封装一个请求对象
req = urllib.request.Request(url=url, headers=headers)
# 获取网页的响应对象response
resp = urllib.request.urlopen(req)
# 获取页面的信息
html = resp.read().decode("utf-8")
return html
# 对页面进行解析,获得想要的内容
def parseHtml(self, html):
pass
# 保存文件
def savefile(self, filename, content):
with open(file=filename, mode="w", encoding="utf-8") as f:
f.write(content)
# 函数的入口
def startRun(self):
word = input("要搜索的关键字:")
pn = int(input("输入要跳转的页数:"))
# 封装参数
params = {
"kw": word,
"pn": str(pn * 50)
}
params = parse.urlencode(params)
# 进行字符串的拼凑
url = self.url.format(params)
# 定义保存文件的路径
filename = "{}-{}页.html".format(word, pn)
print(url)
# 获取网页内容
html = self.getUrlInfo(url)
print(html)
# 保存信息到文件
self.savefile(filename, html)
# 提示
print(f"第{pn}页抓取成功")
# 让程序休眠1秒
time.sleep(1)
# 程序的主方法
if __name__ == "__main__":
# 创建一个对象
mySpider = MySpider()
# 执行程序
mySpider.startRun()
re模块的使用
常用方法
- re.compile()
生成一个正则表达式对象
regex=re.compile(pattern,flags=0)
pattern:正则匹配的规则
flags:代表功能标志位,扩展正则表达式的匹配
- re.findall()
正则表达式匹配目标字符串内容
re.findall(pattern,string,flags=0)
pattern:正则匹配的规则
string:目标字符串
flags:代表功能标志位,扩展正则表达式的匹配
- regex.findall()
该函数根据正则表达式对象匹配目标字符串内容
regex.findall(string,pos,endpos)
string 目标字符串。
pos 截取目标字符串的开始匹配位置。
endpos 截取目标字符串的结束匹配位置。
- re.split()
函数使用正则表达式匹配内容,切割目标字符串。返回值为切割后的列表
re.split(pattern,string,flags=0)
pattern:正则表达式。
string:目标字符串。
flags:功能标志位,扩展正则表达式的匹配。
- re.sub()
该函数使用一个字符串替换正则表达式匹配到的内容。返回值是替换后的字符串。
re.sub(pattern,replace,string,max,flags=0)
pattern:正则表达式。
replace:替换的字符串。
string:目标字符串。
max:最多替换几处,默认替换全部,
flags:功能标志位,扩展正则表达式的匹配。
- re.search()
匹配目标字符串第一个符合的内容,返回值为匹配的对象
re.search(pattern,string,flags=0)
pattern:正则表达式
string:目标字符串
flags功能标志位
| 缩写元字符 | 说明 |
|---|---|
| A | 元字符只能匹配 ASCII码。 |
| I | 匹配忽略字母大小写。 |
| S | 使得.元字符可以匹配换行符。 |
| M | 使 ^ $ 可以匹配每一行的开头和结尾位置。 |
- 使用
re.findall(pattern,string,re.S)
csv模块的使用
csv介绍
CSV 文件又称为逗号分隔值文件,是一种通用的、相对简单的文件格式,用以存储表格数据,包括数字或者字符。CSV 是电子表格和数据库中最常见的输入、输出文件格式。
- 文件格式


CSV文件写入
- csv.writer()
write(csvfile,dialect="excel",**fmtparams)
csvfile:必须是支持迭代(Iterator)的对象,可以是文件或者list对象
dialect:编码风格,默认为excel的风格,也就是使用逗号,分隔
fmtparam:格式化参数,用来覆盖之前dialect对象指定的编码风格
- 范例
import re
import csv
from urllib import parse
with open("eggs.csv", "w", newline="") as f:
# delimiter 指定分隔符,默认是逗号,这里只当空格
# quotechar 表示引用符,当一句话中有与分隔符相同的符号时,为了区分,使用引用符括起来
# writerow 单行写入,列表格式传入数据,写入多行writerows(),传入列表,元素为元组
spamwriter = csv.writer(f, delimiter=" ", quotechar="*")
spamwriter.writerow(['www.biancheng.com'] * 5 + ['how are you'])
spamwriter.writerow(['hello world', 'web site', 'www.biancheng.com'])
- csv.DictWriter()
以字典的形式写入数据
- 范例
with open(file="demo02.csv",mode="w",newline="",encoding="utf-8") as f:
# 声明表头
fieldName=["姓名","年龄","性别"]
spamwriter=csv.DictWriter(f,fieldnames=fieldName)
# 写入字段当作表头
spamwriter.writeheader()
spamwriter.writerow({"姓名":"丫丫","年龄":"18","性别":"女"}
CSV的读取
- csv.reader()
csv.reader(csvfile, dialect='excel', **fmtparams)
csvfile:必须是支持迭代(Iterator)的对象,可以是文件或者list对象
dialect:编码风格,默认为excel的风格,也就是使用逗号,分隔
fmtparam:格式化参数,用来覆盖之前dialect对象指定的编码风格
- 范例
with open("demo.csv","r",newline="",encoding="utf-8") as f:
spamwriter=csv.reader(f,delimiter="-",quotechar="|")
for row in spamwriter:
print(row)
- csv.DictReader()
with open("demo02.csv",newline="",encoding="utf-8") as f:
reader=csv.DictReader(f)
print(type(reader))
for row in reader:
print(row["姓名"],row["年龄"],row["性别"])
其他
robots协议
input()
input([prompt]):接受一个标准输入数据,返回一个字符串
prompt:提示,提示信息
parse.quote(str)
对字符串进行编码,
按照标准,URL只允许一部分ASCII字符,其他字符(如汉字)是不符合标准的,此时就要进行编码
str.format()
pyhton2.6新增的一种格式化字符串的函数
>>>"{} {}".format("hello", "world") # 不设置指定位置,按默认顺序
'hello world'
>>> "{0} {1}".format("hello", "world") # 设置指定位置
'hello world'
>>> "{1} {0} {1}".format("hello", "world") # 设置指定位置
'world hello world'
random.choice()
choice() 方法返回一个列表,元组或字符串的随机项。
注意:choice()不能直接访问,需要导入random模块
urlencode(dict)
将存入的字典参数编码为URL查询字符串,即转换成以key1=value1&key2=value2的形式
time.sleep()
time.sleep(random.randint(1,2)) 随机休眠1-2秒
作用:爬虫程序访问网站会非常快,这与正常人类的点击行为非常不符。因此,通过随机休眠可以使爬虫程序模仿成人类的样子点击网站,从而让网站不易察觉是爬虫访问网站,但这样做的代价就是影响程序的执行效率。
正则表达式元字符()的作用:分组
(pattern) 匹配pattern并获取这一匹配的内容,如果有多个(),就会返回多个结果的集合
获取符合分组内的规则的字符串
正则表达式贪婪模式和非贪婪模式
通过在量词后面加?
不加问号就是贪婪模式,加问号就是非贪婪模式
例如:.*? 和 {m}?
区别:
贪婪模式:尽可能多的去匹配
非贪婪模式:尽可能少的去匹配
*参数名和**参数名
作为函数定义时:
1、*参数收集所有未匹配的位置参数组成一个tuple对象,局部变量args指向此tuple对象
2、**参数收集所有未匹配的关键字参数组成一个dict对象,局部变量kwargs指向此dict对象
作为函数调用时:
1、*参数用于解包tuple对象的每个元素,作为一个一个的位置参数传入到函数中
2、**参数用于解包dict对象的每个元素,作为一个一个的关键字参数传入到函数中

浙公网安备 33010602011771号