一、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 后要加()