Python-爬虫实战练习
爬虫前期准备
01 爬虫就是模拟浏览器抓取东西,爬虫三部曲:数据爬取、数据解析、数据存储
数据爬取:手机端、pc端数据解析:正则表达式数据存储:存储到文件、存储到数据库
02. 相关python库
爬虫需要两个库模块:requests和re
1. requests库
requests是比较简单易用的HTTP库,相较于urllib会简洁很多,但由于是第三方库,所以需要安装,文末附上安装教程链接(链接全在后面,这样会比较方便看吧,贴心吧~)
requests库支持的HTTP特性:
保持活动和连接池、Cookie持久性会话、分段文件上传、分块请求等
Requests库中有许多方法,所有方法在底层的调用都是通过request()方法实现的,所以严格来说Requests库只有request()方法,但一般不会直接使用request()方法。以下介绍Requests库的7个主要的方法:
①requests.request()
构造一个请求,支撑一下请求的方法
具体形式:requests.request(method,url,**kwargs)
method:请求方式,对应get,post,put等方式
url:拟获取页面的url连接
**kwargs:控制访问参数
②requests.get()
获取网页HTM网页的主要方法,对应HTTP的GET。构造一个向服务器请求资源的Requests对象,返回一个包含服务器资源的Response对象。
Response对象的属性:
属性说明r.status_codeHTTP请求的返回状态(连接成功返回200;连接失败返回404)r.textHTTP响应内容的字符串形式,即:url对应的页面内容r.encoding从HTTP header中猜测的响应内容编码方式r.apparent_encoding从内容中分析出的响应内容编码方式(备选编码方式)r.contentHTTP响应内容的二进制形式
具体形式:res=requests.get(url)
code=res.text (text为文本形式;bin为二进制;json为json解析)
③requests.head()
获取HTML的网页头部信息,对应HTTP的HEAD
具体形式:res=requests.head(url)
④requests.post()
向网页提交post请求方法,对应HTTP的POST
具体形式:res=requests.post(url)
⑤requests.put()
向网页提交put请求方法,对应HTTP的PUT
⑥requests.patch()
向网页提交局部修改的请求,对应HTTP的PATCH
⑦requests.delete()
向网页提交删除的请求,对应HTTP的DELETE
"""requests 操作练习"""
import requests
import re
#数据的爬取
h = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'
}
response = requests.get('https://movie.douban.com/chart',headers=h)
html_str = response.text
#数据解析<a class="nbg" href="https://movie.XX.com/subject/34961898/" title="汉密尔顿">
pattern = re.compile('<a class="nbg".*?title="(.*?)">') # .*? 任意匹配尽可能多的匹配尽可能少的字符
result = re.findall(pattern,html_str)
print(result)
2. re正则表达式:(Regular Expression)
一组由字母和符号组成的特殊字符串,作用:从文本中找到你想要的格式的句子
关于 .*? 的解释:
* 匹配前面的子表达式零次或多次。例如,zo能匹配“z”以及“zoo”。等价于{0,}。
? 匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串。例如,对于字符串“oooo”,“o+?”将匹配单个“o”,而“o+”将匹配所有“o”。
. 匹配除“\n”之外的任何单个字符。要匹配包括“\n”在内的任何字符,请使用像“(.
.* 具有贪婪的性质,首先匹配到不能匹配为止,根据后面的正则表达式,会进行回溯。
.*?则相反,一个匹配以后,就往下进行,所以不会进行回溯,具有最小匹配的性质(尽可能匹配少的字符但是要匹配出所有的字符)。
(.*) 是贪婪匹配代表尽可能多的匹配字符因此它将h和l之间所有的字符都匹配了出来
03. xpath解析源码
import requests
import re
from bs4 import BeautifulSoup
from lxml import etree
#数据爬取(一些HTTP头的信息)
h = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'
}
response = requests.get('https://movie.XX.com/chart',headers=h)
html_str = response.text
#数据解析
#正则表达式解析
def re_parse(html_str):
pattern = re.compile('<a class="nbg".*?title="(.*?)"')
results = re.findall(pattern,html_str)
print(results)
return results
#bs4解析
def bs4_parse(html_str):
soup = BeautifulSoup(html_str,'lxml')
items = soup.find_all(class_='nbg')
for item in items:
print(item.attrs['title'])
#lxml解析
def lxml_parse(html_str):
html = etree.HTML(html_str)
results = html.xpath('//a[@class="nbg"]/@title')
print(results)
return results
re_parse(html_str)
bs4_parse(html_str)
lxml_parse(html_str)
04. python写爬虫的架构
从图上可以看到,整个基础爬虫架构分为5大类:爬虫调度器、URL管理器、HTML下载器、HTML解析器、数据存储器。
下面给大家依次来介绍一下这5个大类的功能:
① 爬虫调度器:主要是配合调用其他四个模块,所谓调度就是去调用其他的模板。
② URL管理器:就是负责管理URL链接的,URL链接分为已经爬取的和未爬取的,这就需要URL管理器来管理它们,同时它也为获取新URL链接提供接口。
③ HTML下载器:就是将要爬取的页面的HTML下载下来。
④ HTML解析器:就是将要爬取的数据从HTML源码中获取出来,同时也将新的URL链接发送给URL管理器以及将处理后的数据发送给数据存储器。
⑤ 数据存储器:就是将HTML下载器发送过来的数据存储到本地。
whois爬取
每年,有成百上千万的个人、企业、组织和政府机构注册域名,每个注册人都必须提供身份识别信息和联系方式,包括姓名、地址、电子邮件、联系电话、管理联系人和技术联系人一这类信息通常被叫做whois数据
"""
whois
http://whois.chinaz.com/sina.com
"""
import requests
import re
h = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'
}
response = requests.get('http://whois.chinaz.com/'+input("请输入网址:"),headers=h)
print(response.status_code)
html = response.text
#print(html)
#解析数据
pattern = re.compile('class="MoreInfo".*?>(.*?)</p>',re.S)
result = re.findall(pattern,html)
# 方法一:
# str = re.sub('\n',',',result[0])
# print(str)
#方法二:
print(result[0].replace('/n',','))
爬取电影信息
"""爬取*眼电影前100电影信息"""
import requests
import re
import time
# count = [0,10,20,30,40,50,60,70,80,90]
h = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'
}
responce = requests.get('https://XX.com/board/4?offset=0', headers=h)
responce.encoding = 'utf-8'
html = responce.text
# 解析数据 time.sleep(2)
patter = re.compile('class="name">.*?title="(.*?)".*?主演:(.*?)</p>.*?上映时间:(.*?)</p>', re.S)
#time.sleep(2)
result = re.findall(patter, html)
print(result)
with open('maoyan.txt', 'a', encoding='utf-8') as f:
for item in result: # 读取result(以元组的形式储存)中的内容=》
for i in item:
f.write(i.strip().replace('\n', ','))
#print('\n')
爬取图片
"""*精灵爬取练习 http://616pic.com/png/ ==》 http://XX.616pic.com/ys_img/00/06/20/64dXxVfv6k.jpg"""
import requests
import re
import time
#数据的爬取img的url
def get_urls():
response = requests.get('http://XX.com/png/')
html_str = response.text
#解析数据,得到url
pattern = re.compile('<img class="lazy" data-original="(.*?)"')
results = re.findall(pattern,html_str)
print(results)
return results
#<img class="lazy" data-original="http://XX.616pic.com/ys_img/00/06/20/64dXxVfv6k.jpg">
#下载图片
def down_load_img(urls):
for url in urls:
response = requests.get(url)
with open('temp/'+url.split('/')[-1], 'wb') as f:
f.write(response.content)
print(url.split('/')[-1],'已经下载成功')
if __name__ == '__main__':
urls = get_urls()
爬取小仙女
'''头条美女爬取====方法一'''import requests
import re
url = 'https://www.XX.com/api/search/content/?aid=24&app_name=web_search&offset=0&format=json&keyword=%E7%BE%8E%E5%A5%B3&autoload=true&count=20&en_qc=1&cur_tab=1&from=search_tab&pd=synthesis×tamp=1596180364628&_signature=-Bv0rgAgEBA-TE0juRclmfgatbAAKdC7s6ktYqc7u9jLqXOQ5SBCDkd25scxRvDydd6TgtOw0B7RVuaQxhwY1BwV89sPbdam8LkNuV08d0QfrZqQ4oOOrOukEJ1qxroigLT'
response = requests.get(url)
print(response.status_code)
html_str = response.text
#解析"large_image_url":"(.*?)"
pattern = re.compile('"large_image_url":"(.*?)"')
urls = re.findall(pattern,html_str)
print(urls)def down_load(urls):
for url in urls:
response = requests.get(url)
with open('pic/'+url.split('/')[-1],'wb') as f:
f.write(response.content)
print(url.split('/')[-1],'已经下载成功')
if __name__ == '__main__':
down_load(urls)
'''头条美女爬取====方法二'''import requests
import re
from urllib.parse import urlencode
#https://www.XX.com/api/search/content/?aid=24&app_name=web_search&offset=0&format=json&keyword=%E7%BE%8E%E5%A5%B3&autoload=true&count=20def get_urls(page):
keys = {
'aid':'24',
'app_name':'web_search',
'offset':20*page,
'keyword':'美女',
'count':'20'
}
keys_word = urlencode(keys)
url = 'https://www.XX.com/api/search/content/?'+keys_word
response = requests.get(url)
print(response.status_code)
html_str = response.text
# 解析"large_image_url":"(.*?)"
pattern = re.compile('"large_image_url":"(.*?)"',re.S)
urls = re.findall(pattern, html_str)
return urls#下载图片
def download_imags(urls):
for url in urls:
response = requests.get(url)
with open('pic/'+url.split('/')[-1]+'.jpg','wb') as f:
f.write(response.content)
print(url.split('/')[-1]+'.jpg',"已下载~~")if __name__ == '__main__':
for page in range(3):
urls = get_urls(page)
print(urls)
download_imags(urls)
5 线程池
线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。
"""线程池"""from concurrent.futures import ThreadPoolExecutor
import time
import threadingdef ban_zhuang(i):
print(threading.current_thread().name,"**开始搬砖{}**".format(i))
time.sleep(2)
print("**员工{}搬砖完成**一共搬砖:{}".format(i,12**2)) #将format里的内容输出到{}if __name__ == '__main__': #主线程
start_time = time.time()
print(threading.current_thread().name,"开始搬砖")
with ThreadPoolExecutor(max_workers=5) as pool:
for i in range(10):
p = pool.submit(ban_zhuang,i)
end_time =time.time()
print("一共搬砖{}秒".format(end_time-start_time))
结合多线程的爬虫:
'''头条美女爬取'''import requests
import re
from urllib.parse import urlencode
import timeimport threading
#https://www.XX.com/api/search/content/?aid=24&app_name=web_search&offset=0&format=json&keyword=%E7%BE%8E%E5%A5%B3&autoload=true&count=20def get_urls(page):
keys = {
'aid':'24',
'app_name':'web_search',
'offset':20*page,
'keyword':'美女',
'count':'20'
}
keys_word = urlencode(keys)
url = 'https://www.XX.com/api/search/content/?'+keys_word
response = requests.get(url)
print(response.status_code)
html_str = response.text
# 解析"large_image_url":"(.*?)"
pattern = re.compile('"large_image_url":"(.*?)"',re.S)
urls = re.findall(pattern, html_str)
return urls#下载图片
def download_imags(urls):
for url in urls:
try:
response = requests.get(url)
with open('pic/'+url.split('/')[-1]+'.jpg','wb') as f:
f.write(response.content)
print(url.split('/')[-1]+'.jpg',"已下载~~")
except Exception as err:
print('An exception happened: ')
if __name__ == '__main__':
start = time.time()
thread = []
for page in range(3):
urls = get_urls(page)
#print(urls)
#多线程
for url in urls:
th = threading.Thread(target=download_imags,args=(url,))
#download_imags(urls)
thread.append(th)
for t in thread:
t.start()
for t in thread:
t.join()end = time.time()
print('耗时:',end-start)
6 tips--爬虫协议
Robots协议,又称作爬虫协议,机器人协议,全名叫做网络爬虫排除标准(Robots Exclusion Protocol),是用来告诉爬虫和搜索引擎哪些页面可以抓取,哪些不可以抓取,通常为一个robots.txt文本文件,一般放在网站的根目录下。
Robots协议:在网页的根目录+/robots.txt 如www.baidu.com/robots.txt
User-agent: Baiduspider
Disallow: /baidu
Disallow: /s?
Disallow: /ulink?
Disallow: /link?
Disallow: /home/news/data/
Disallow: /bhUser-agent: Googlebot
Disallow: /baidu
Disallow: /s?
Disallow: /shifen/
Disallow: /homepage/
Disallow: /cpro
Disallow: /ulink?
Disallow: /link?
Disallow: /home/news/data/
Disallow: /bh
tips:要遵守爬虫协议哟,呐。。只能用于爬着玩儿哈~~~记得挂代理~~~
7 相关链接
requests的安装与使用 https://www.jianshu.com/p/140012f88f8e
re的使用说明 https://www.cnblogs.com/vmask/p/6361858.html
其他的爬虫相关文章 https://blog.csdn.net/qq_27297393/article/details/81630774
爬虫的视频 https://www.imooc.com/learn/563
Python-爬虫实战练习相关推荐
- 线程,协程对比和Python爬虫实战说明
此文首发于我的个人博客:线程,协程对比和Python爬虫实战说明 - zhang0peter的个人博客 这篇文章写的是我对线程和协程的理解,有错误之处欢迎指出. 举一个餐馆的例子.我们把一个餐厅当做一 ...
- python爬虫图片实例-【图文详解】python爬虫实战——5分钟做个图片自动下载器...
我想要(下)的,我现在就要 python爬虫实战--图片自动下载器 之前介绍了那么多基本知识[Python爬虫]入门知识(没看的赶紧去看)大家也估计手痒了.想要实际做个小东西来看看,毕竟: talk ...
- python爬虫项目-32个Python爬虫实战项目,满足你的项目慌
原标题:32个Python爬虫实战项目,满足你的项目慌 爬虫项目名称及简介 一些项目名称涉及企业名词,小编用拼写代替 1.[WechatSogou]- weixin公众号爬虫.基于weixin公众号爬 ...
- Python爬虫实战六之抓取爱问知识人问题并保存至数据库
大家好,本次为大家带来的是抓取爱问知识人的问题并将问题和答案保存到数据库的方法,涉及的内容包括: Urllib的用法及异常处理 Beautiful Soup的简单应用 MySQLdb的基础用法 正则表 ...
- Python爬虫实战(5):模拟登录淘宝并获取所有订单
Python爬虫入门(1):综述 Python爬虫入门(2):爬虫基础了解 Python爬虫入门(3):Urllib库的基本使用 Python爬虫入门(4):Urllib库的高级用法 Python爬虫 ...
- Python爬虫实战(4):抓取淘宝MM照片
Python爬虫入门(1):综述 Python爬虫入门(2):爬虫基础了解 Python爬虫入门(3):Urllib库的基本使用 Python爬虫入门(4):Urllib库的高级用法 Python爬虫 ...
- Python爬虫实战(3):计算大学本学期绩点
Python爬虫入门(1):综述 Python爬虫入门(2):爬虫基础了解 Python爬虫入门(3):Urllib库的基本使用 Python爬虫入门(4):Urllib库的高级用法 Python爬虫 ...
- Python爬虫实战之(五)| 模拟登录wechat
作者:xiaoyu 微信公众号:Python数据科学 知乎:Python数据分析师 不知何时,微信已经成为我们不可缺少的一部分了,我们的社交圈.关注的新闻或是公众号.还有个人信息或是隐私都被绑定在了一 ...
- Python爬虫实战之(五)| 模拟登录wechat 1
作者:xiaoyu 微信公众号:Python数据科学 知乎:Python数据分析师 不知何时,微信已经成为我们不可缺少的一部分了,我们的社交圈.关注的新闻或是公众号.还有个人信息或是隐私都被绑定在了一 ...
- qq纵横四海源码_【0基础】纵横中文网python爬虫实战
原文在此~ [0基础]纵横中文网python爬虫实战mp.weixin.qq.com 大家好,我是你们的机房老哥! 在粉丝群的日常交流中,爬虫是比较常见的话题.python最强大的功能之一也是爬虫. ...
最新文章
- 决策树算法实现(train+test,matlab) 转
- 用Select查询结果创建ACCESS表
- 在C#中使用SqlDbType.Xml类型参数
- python 面向对象学习
- python程序导入import、规范化和封装自己写的.py文件
- 使用X Manager远程CentOS 7服务器(XDMCP)
- 地图容器自适应浏览器是什么意思_Web移动端实现自适应缩放界面的方法汇总
- sharepoint2010的弹出等待提示的对话框
- wetask.cn领度任务全新试用体验
- java多选代码_[一天一点java web]复选框全选代码
- Junit介绍与实现
- 【jQuery】JQuery-ui autocomplete与strtus2结合使用
- 计算机放样在钢结构应用,计算机放样应用于钢结构工程
- 后台登录管理员数据表创建
- 安卓手机内外SD卡互换
- 携程2019校园秋招后台开发笔试题(Java)
- 我平时的一个学习方法
- LVM逻辑卷快照的添加,删除逻辑卷!
- css 剪辑图片_css剪裁GIF背景图片动画特效
- 字符串转utf8编码
热门文章
- 程序员业余时间怎么快速一年赚20万
- 怎么用计算机弹你的酒馆对我打了烊,抖音你的酒馆对我打了烊歌词完整版介绍...
- JAVA计算机毕业设计web人力资源管理系统Mybatis+源码+数据库+lw文档+系统+调试部署
- Bootstrap复习四——CSS组件2
- JDBC连接MySQL时出现的错误
- uni-app 自定义导航栏
- Windows下postgresql安装步骤(超级详细)
- Image De-raining Using a Conditional Generative Adversarial Network
- It Rains Again
- Linux命令-cmatrix炫酷屏保软件