一、bs4的使用
from bs4 import BeautifulSoup
pip3 install lxml html_doc=""" <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>绝美护士SOLO尹菲给你一个心潮澎湃的制服之夜 - 性感妹子 - 妹子图</title> <meta name="keywords" content="" /> <meta name="description" content="绝美护士SOLO尹菲给你一个心潮澎湃的制服之夜 - 第1页 - 妹子图每日分享最新最全的高清性感美女图片" /> <script type="text/javascript" src="https://ip.ws.126.net/ipquery?"></script> <script type="text/javascript" src="https://cdn.jsdelivr.net/gh/xmzt/static/mzitu/u.js"></script> <link rel="canonical" href="https://www.mzitu.com/133296" /> <link rel="alternate" media="only screen and(max-width: 640px)" href="https://m.mzitu.com/133296" > <meta name="mobile-agent" content="format=html5;url=https://m.mzitu.com/133296" /> <meta name="applicable-device" content="pc"> <meta http-equiv="Cache-Control" content="no-transform" /> <meta http-equiv="Cache-Control" content="no-siteapp" /> <meta name="renderer" content="webkit"> <link href="https://cdn.jsdelivr.net/gh/xmzt/static/mzitu/pc/style.css" rel="stylesheet" type="text/css" /> <script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?cb7f29be3c304cd3bb0c65a4faa96c30"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script> </head> <body> <div class="header"> <div class="mainnav"> <h1 class="logo"><a href="https://www.mzitu.com/" title="妹子图">妹子图</a></h1> <ul id="menu-nav" class="menu"><li><a title="首页" href="https://www.mzitu.com/">首页</a></li> <li class="current-menu-parent"><a title="性感妹子" href="https://www.mzitu.com/xinggan/">性感妹子</a></li> <li><a title="日本妹子" href="https://www.mzitu.com/japan/">日本妹子</a></li> <li><a title="台湾妹子" href="https://www.mzitu.com/taiwan/">台湾妹子</a></li> <li><a title="清纯妹子" href="https://www.mzitu.com/mm/">清纯妹子</a></li> <li><a title="妹子自拍" href="https://www.mzitu.com/zipai/">妹子自拍</a></li> <li><a title="街拍美女" href="https://www.mzitu.com/jiepai/">街拍美女</a></li> <li><a title="下载妹子图APP" href="http://www.mzitu.com/app/">下载APP</a></li> """ #类实例化得到一个对象 soup = BeautifulSoup(html_doc,'lxml') #lxml是一个解析工具,html_doc是一个html文件数据
#soup对象相当于一个页面对象,可以点出其内部所有的标签或者属性
#遍历文档树:即直接通过标签名字选择,特点就是选择速度快,但如果存在多个相同的标签则只返回第一个
#1 用法 head=soup.head #找到head标签 # print(head) #2 获取标签的名称 # print(head.name) #3 获取标签的属性 非常重要 # a=soup.body.a # print(a.attrs) #这就是标签的属性 # print(a.attrs.get('title')) # # print(a['title']) #这样也可以取出 #4 获取标签的内容 # a=soup.body.a # print(a.text) #会拿自己标签下子子孙孙的所有内容然后拼接到一起(因为我用的是a标签所有看不出来) # print(a.string)# p下的文本只有一个时,取到,否则为None # print(a.strings)# 生成器对象,加了s # print(list(a.strings))#拿到a标签下所有文本内容,一个一个的在生成器中 # 5 嵌套选择 # a=soup.body.a # print(a.get('id')) #没有则为None #子节点,子孙节点(用的比较少) # print(soup.li.contents)#li下所有子节点 # print(soup.li.children)#得到一个迭代器,包含li下所有子节点 #搜索文档树 #find() 只返回找到的第一个 #find_all() #找到所有的 #五种过滤器:字符串,正则表达式,列表,True,方法 #字符串过滤,过滤的内容是字符串(最常用的) #方法一: # a=soup.find(name='a') #本质就是用的find_all # print(a) # a=soup.find(id='menu-nav') # a=soup.find(class_='logo') #在用class查找的时候后面一定要加class_ # a=soup.find(href='https://www.mzitu.com/japan/') # print(a) #方法二 # res = soup.find(attrs={'id':'menu-nav'}) # res = soup.find(attrs={'class':'logo'}) #如果用这种方法,class就不用加_ # print(res) #正则表达式 # import re # re_b = re.compile('^m') # res=soup.find(name=re_b) # res=soup.find_all(name=re_b) # res = soup.find(id=re_b) # print(res) # 列表匹配 # res=soup.find(name=['body','a','head']) # print(res) #True和False # res = soup.find_all(name=True) # res = soup.find_all(id=True) # print(res) # 方法(用函数) 基本不用 # limit(限制查找的条数) # res=soup.find_all(name='a',limit=1) #查找的就是第一条 # print(res) #recursive(recursive默认是True,代表递归查找,找子子孙孙) # res=soup.find_all(name='a',recursive=False) # res=soup.find_all(name='a',recursive=True) # print(res) #css选择器 # ret=soup.select('#re_b') # print(ret) ret=soup.select('body li')#body下的li子子孙孙 # ret=soup.select('body>div')#直接子节点 # ret=soup.select('body>div')[0].text#直接子节点,取出子节点的内容,拼接到一起 # ret=soup.select('body>div')[0].a.find()#直接子节点 # print(ret) #bs4的修改文档树 软件配置文件是xml格式的(了解) #现在主流的软件的配置文件格式 #ini:configparser #conf #xml:可以用bs4修改 #yaml
二、爬取汽车之家新闻
import requests import re # pip3 install beautifulsoup4 解析html和xml,修改html和xml from bs4 import BeautifulSoup headers={'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36 QIHU 360EE', } res = requests.get('https://www.autohome.com.cn/news/') # print(res.text) # 第一个参数:需要解析的数据 # 第二个参数:解析器(html.parser内置的,不需要安装第三方模块) # soup = BeautifulSoup(res.text,'html.parser') # soup = BeautifulSoup(res.text,'lxml')#用这种方法会中文文字出现乱码 soup = BeautifulSoup(res.content, 'lxml')#获取到的是二进制,会自动解码 # 查找class为article-wrapper的div # div=soup.find(class_='article-wrapper') # div=soup.find(id='auto-channel-lazyload-article') # print(div) ul = soup.find(class_='article') # print(ul) # 继续找ul下的所有li li_list = ul.find_all(name='li') # print(len(li_list)) for li in li_list: # 找每个li下的东西 title = li.find(name='h3') if title: title = title.text # url = li.find('a')['href'] #拿到li中的a标签,然后通过字典取值,拿到href # li.find('a').attrs #这个才是字典 url = 'https:' + li.find('a').attrs.get('href') # .attrs是li对象的一堆属性,是一个字典,由于属性中ongoing只有href,所以直接拿出来了 desc = li.find('p').text img = 'https:'+li.find(name='img')['src'] #最好用.attrs.get('src') # print(img) # print(desc) # print(url) # print(title) print(""" 新闻标题:%s 新闻地址:%s 新闻摘要:%s 新闻图片:%s """%(title,url,desc,img))
三、代理池的搭建
# github,下载免费代理池开源代码(建议读一下别人的代码) # git clone git@github.com:jhao104/proxy_pool.git # pycharm打开,修改配置文件(reids地址修改) # 启动爬虫: python proxyPool.py schedule # 启动服务: python3 proxyPool.py server # 随机获取一个代理 requests.get("http://127.0.0.1:5010/get/").json() #删除一个代理 requests.get("http://127.0.0.1:5010/delete/?proxy={}".format(proxy))
五、超级鹰
#!/usr/bin/env python # coding:utf-8 import requests from hashlib import md5 class Chaojiying_Client(): def __init__(self, username, password, soft_id): self.username = username self.password = password.encode('utf8') self.password = md5(password).hexdigest() self.soft_id = soft_id self.base_params = { 'user': self.username, 'pass2': self.password, 'softid': self.soft_id, } self.headers = { 'Connection': 'Keep-Alive', 'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)', } def PostPic(self, im, codetype): """ im: 图片字节 codetype: 题目类型 参考 http://www.chaojiying.com/price.html """ params = { 'codetype': codetype, } params.update(self.base_params) files = {'userfile': ('ccc.jpg', im)} r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers) return r.json() def ReportError(self, im_id): """ im_id:报错题目的图片ID """ params = { 'id': im_id, } params.update(self.base_params) r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers) return r.json() if __name__ == '__main__': chaojiying = Chaojiying_Client('306334678', 'lqz12345', '903641') # 用户中心>>软件ID 生成一个替换 96001 im = open('a.jpg', 'rb').read() # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要// print(chaojiying.PostPic(im, 1902))# 1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加()