首页 > 技术文章 > 爬虫之bs4的使用,之爬取汽车之家新闻,之代理池的搭建

ltyc 2020-12-28 17:17 原文

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

 

推荐阅读