了解python爬虫
本系列来源于B站视频。UP主为IT搬運工,系列视频为[小甲鱼]零基础入门学习python。点我直达
什么是爬虫
又称为网页蜘蛛,在网页上获取所需要的信息。
python如何访问互联网
url + lib= urllib
URL
协议://IP地址/资源具体地址
lib
urllib
实战
爬取html
爬取网页html代码
import urllib.request
#import ssl
#ssl._create_default_https_context = ssl._create_unverified_context
response = urllib.request.urlopen("http://www.fishc.com") #网址
html = response.read()
html = html.decode("utf-8") #改为utf-8的编码
print(html) #打印消息体
print(response.info()) #打印请求信息
print(response.getcode()) #打印请求返回码
有道翻译
通过有道翻译api实现输入内容的翻译:
import urllib.request
import urllib.parse
import json
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
content = input('请输入需要翻译的内容:')
data = {'i': content, 'from': 'AUTO', 'to': 'AUTO', 'smartresult': 'dict', 'client': 'fanyideskweb',
'salt': '16103741503935', 'sign': '52bbd584e410db9268738912201819eb', 'lts': '1610374150393',
'bv': '4f7ca50d9eda878f3f40fb696cce4d6d', 'doctype': 'json', 'version': '2.1', 'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlME'}
data = urllib.parse.urlencode(data).encode('utf-8')
response = urllib.request.urlopen(url, data)
html = response.read().decode('utf-8')
target = json.loads(html)
print(target["translateResult"][0][0]['tgt'])
实现结果
隐藏
python在进行post请求时,会将post请求的用户标识为python,因此可能会被服务器拒绝连接,所以需要修改用户标识。
head = {
'User-Agent': '自己浏览器字段'}
req = urllib.request.Request(url, data, head)
#以下为urlopen #略过,见上节
#以上为urlopen
print(req.headers)
#修改http 的请求头中的User-Agent字段为自己浏览器的字段
循环翻译请求
import urllib.request
import urllib.parse
import json
import time
while True:
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
'''
head = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)\
Chrome/87.0.4280.88 Safari/537.36'}
'''
content = input('请输入需要翻译的内容:(输入"q!"退出程序)')
if content == 'q!':
break
data = {'i': content, 'from': 'AUTO', 'to': 'AUTO', 'smartresult': 'dict', 'client': 'fanyideskweb',
'salt': '16103741503935', 'sign': '52bbd584e410db9268738912201819eb', 'lts': '1610374150393',
'bv': '4f7ca50d9eda878f3f40fb696cce4d6d', 'doctype': 'json', 'version': '2.1', 'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlME'}
data = urllib.parse.urlencode(data).encode('utf-8')
#req = urllib.request.Request(url, data, head)
req = urllib.request.Request(url, data)
req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)\
Chrome/87.0.4280.88 Safari/537.36')
response = urllib.request.urlopen(url, data)
html = response.read().decode('utf-8')
target = json.loads(html)
print(target["translateResult"][0][0]['tgt'])
time.sleep(3)
#print(req.headers)
运行结果
请输入需要翻译的内容:(输入”q!”退出程序)刷漆
Brush paint
请输入需要翻译的内容:(输入”q!”退出程序)帅气
handsome
请输入需要翻译的内容:(输入”q!”退出程序)q!进程已结束,退出代码0
代理
步骤:
1,参数时一个字典{‘类型’:‘代理ip’:‘端口号’}
proxy_support = urllib.request.ProxyHandler({})
2,定制、创建一个opener
opener = urllib.request.build_opener(proxy_support)
3a,安装opener
urllib.request.install_opener(opener)
3b,调用opener
opener.open(url)
爬取妹子图片
由于技术水平太菜外加网站做了反爬处理,所以返回403禁止访问
import urllib.request
import os
def get_html(url):
req = urllib.request.Request(url)
req.add_header('user-agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36')
response = urllib.request.urlopen(url)
html = response.read().decode('utf-8')
print(html)
return html
def find_imgs(html):
img_addr = []
a = html.find('img src=')
while a != -1:
b = html.find('.jpg', a, a + 255)
if b != -1:
img_addr.append(html[a+9:b+4])
else:
b = a+9
a = html.find('img src=', b)
for each in img_addr:
print(each)
return img_addr
def save_imgs(folder, img_addr):
for each in img_addr:
file_name = each.split('/')[-1]
with open(file_name, 'wb') as f:
img = urllib.request.openurl(each)
f.write(img)
def download_mm(folder='OOXX', pages=10):
#创建文件夹
os.mkdir(folder)
#跳转到路径
os.chdir(folder)
#访问链接
url = 'https://www.mzitu.com/zipai/'
#获取html
html = get_html(url)
for i in range(pages):
#找到图片元素
img_addr = find_imgs(html)
#保存图片
save_imgs(folder, img_addr)
if __name__ == '__main__':
download_mm()
正则表达式
import re
#search 用于正则表达式查找第一次出现的位置
print(re.search(r'Moliam', 'I am Moliam'))
# .(英文句号):代表除了换行符的任何字符,所以返回0,匹配为I
print(re.search(r'.', 'I am Moliam'))
print(re.search(r'M.', 'I am Moliam'))
#加上\去除.的通配符
print(re.search(r'\.', 'I am Moliam.'))
#\d 匹配任何单个数字 数字对于字符串只有0-9
print(re.search(r'\d\d\d', 'I am Moliam.100'))
#[] 字符类:只要匹配字符类中的任何元素都算匹配,大小写敏感
print(re.search(r'[aeiou]', 'I am Moliam.100'))
# - 表示范围
print(re.search(r'[a-z]', 'I am Moliam.100'))
# {} 限定重复次数 下例中b要有且只能重复3次
print(re.search(r'ab{3}c', 'abbbc'))
# 3-10次重复 均可算匹配成功
print(re.search(r'ab{3,10}c', 'abbbc'))
#寻找字符串中的0-255 | 为逻辑或 必须写3位
print(re.search(r'[01]\d\d|2[0-4]\d|25[0-5]', '233'))
print(re.search(r'[01]\d\d|2[0-4]\d|25[0-5]', '3'))
运行结果
<re.Match object; span=(5, 11), match=’Moliam’>
<re.Match object; span=(0, 1), match=’I’>
<re.Match object; span=(5, 7), match=’Mo’>
<re.Match object; span=(11, 12), match=’.’>
<re.Match object; span=(12, 15), match=’100’>
<re.Match object; span=(2, 3), match=’a’>
<re.Match object; span=(2, 3), match=’a’>
<re.Match object; span=(0, 5), match=’abbbc’>
<re.Match object; span=(0, 5), match=’abbbc’>
<re.Match object; span=(0, 3), match=’233’>
None
异常处理
URLError
HTTPError
Scrapy
提取结构性数据的框架
- 创建一个Scrapy项目
- 定义Item容器
- 编写爬虫
- 存储内容
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!