• 爬虫知识--02


    免费代理池搭建

    # 代理有免费和收费代理
    # 代理有http代理和https代理
    # 匿名度:
            高匿:隐藏访问者ip
            透明:服务端能拿到访问者ip
            作为后端,如何拿到使用代理人的ip
            请求头中:x-forword-for
            如一个 HTTP 请求到达服务器之前,经过了三个代理 Proxy1、Proxy2、Proxy3,IP 分别为 IP1、IP2、IP3,用户真实IP为IP0,那么按照XFF标准,服务端最终会收到以下信息:
                    X-Forwarded-For: IP0, IP1, IP2
                    如果拿IP3,remote-addr中        
    # 搭建免费代理池:

            https://github.com/jhao104/proxy_pool
        使用python,爬取免费的代理,解析出ip和端口,地区,存到库中
        使用flask,搭建了一个web服务,只要向 /get 发送一个请求,他就随机返回一个代理ip
    # 步骤:
            1、把项目下载下来
            2、安装依赖,虚拟环境     pip install -r requirements.txt
            3、修改配置文件
                                DB_CONN = 'redis://127.0.0.1:6379/2'
            4、启动爬虫:python proxyPool.py schedule
            5、启动web服务:python proxyPool.py server

    6、以后访问:http://127.0.0.1:5010/get/   可以拿到随机的免费ip

    7、使用代码:

    1. import requests
    2. res = requests.get('http://192.168.1.51:5010/get/?type=https').json()
    3. print(res['proxy'])
    4. # 访问某个代理
    5. res1=requests.get('https://www.baidu.com',proxies={'http':res['proxy']})
    6. print(res1)

    # 项目下载:

    代理池使用

    # 使用django写个项目,只要一访问,就返回访问者ip

    # 编写步骤:
    1、编写django项目,写一个视图函数:

    1. def index(request):
    2.     ip=request.META.get('REMOTE_ADDR')
    3.     return HttpResponse('您的ip 是:%s'%ip)

    2、配置路由:

    1. from app01.views import index
    2. urlpatterns = [
    3.      path('', index),
    4. ]

    3、删除settings.py 中的数据库配置

    4、把代码上传到服务端,运行djagno项目
            python3.8 manage.py runserver 0.0.0.0:8080

    5、本地测试:

    1. import requests
    2. res=requests.get('http://127.0.0.1:5010/get/?type=http').json()
    3. print(res['proxy'])
    4. res1=requests.get('http://47.113.229.151:8080/',proxies={'http':res['proxy']})
    5. print(res1.text)

    爬取某视频网站

     注意:
     1 发送ajax请求,获取真正视频地址
     2 发送ajax请求时,必须携带referer
     3 返回的视频地址,需要处理后才能播放

    1. import requests
    2. import re
    3. res = requests.get('https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=1&start=0')
    4. # print(res.text)
    5. # 解析出所有视频地址---》re解析
    6. video_list = re.findall('', res.text)

    爬取新闻

    # 解析库:汽车之家
    # bs4 解析库  pip3 install beautifulsoup4

              lxml:  pip3 install lxml

    # 爬取所有数据:

    1. import requests
    2. from bs4 import BeautifulSoup
    3. res = requests.get('https://www.autohome.com.cn/news/1/#liststart')
    4. print(res.text)

    # 取出文章详情:

    1. import requests
    2. from bs4 import BeautifulSoup
    3. res = requests.get('https://www.autohome.com.cn/news/1/#liststart')
    4. print(res.text)
    5. soup = BeautifulSoup(res.text, 'html.parser') # 解析库
    6. ul_list = soup.find_all(name='ul', class_='article') # 找到所有 类名是article 的ul标签
    7. for ul in ul_list: # 查找ul标签下的li标签
    8. li_list = ul.find_all(name='li')
    9. for li in li_list:
    10. h3 = li.find(name='h3') # 查找li标签下的所有h3标题
    11. if h3:
    12. title = h3.text # 拿出h3标签的文本内容
    13. content = li.find('p').text # 拿出li标签下的第一个p标签的文本内容
    14. url = 'https:' + li.find(name='a').attrs['href'] # .attrs 拿到标签属性
    15. img = li.find('img')['src'] # 拿出img标签的属性src,可以直接取
    16. print('''
    17. 文章标题:%s
    18. 文章摘要:%s
    19. 文章url:%s
    20. 文章图片:%s
    21. ''' % (title, content, url, img))

    bs4介绍和遍历文档树

    # bs4的概念:是解析 xml/html 格式字符串的解析库
            不但可以解析(爬虫),还可以修改

    # 解析库:

    1. from bs4 import BeautifulSoup
    2. html_doc = """
    3. The Dormouse's story
    4. lqz The Dormouse's story 彭于晏  xx

    5. Once upon a time there were three little sisters; and their names were

    6. Lacie and
    7. and they lived at the bottom of a well.

    8. ...

    9. """
    10. # soup=BeautifulSoup(html_doc,'html.parser')
    11. soup = BeautifulSoup(html_doc, 'lxml')  # pip3 install lxml

    1、文档容错能力:
            res=soup.prettify()
            print(res)

    2、遍历文档树: 文档树:html开头 ------html结尾,中间包含了很多标签
            print(soup.html.head.title)

    3、通过 . 找到p标签  只能找到最先找到的第一个
            print(soup.html.body.p)
            print(soup.p)

    4、获取标签的名称
            p = soup.html.body.p
            print(p.name)

    5、获取标签的属性
            p = soup.html.body.p
            print(p.attrs.get('class'))         # class 特殊,可能有多个,所以放在列表汇总
            print(soup.a.attrs.get('href'))
            print(soup.a['href'])

    6、获取标签的文本内容

    1. 标签对象.text            # 拿标签子子孙孙
    2. 标签对象.string         # 该标签有且只有自己有文本内容才能拿出来
    3. 标签对象.strings       # 拿子子孙孙,都放在生成器中
    4. print(soup.html.body.p.b.text)
    5. print(soup.html.body.p.text)
    6. print(soup.html.body.p.string) # 不能有子 孙
    7. print(soup.html.body.p.b.string) # 有且只有它自己
    8. print(soup.html.body.p.strings) # generator 生成器---》把子子孙孙的文本内容都放在生成器中,跟text很像
    9. print(list(soup.html.body.p.strings)) # generator 生成器---》把子子孙孙的文本内容都放在生成器中,跟text很像

    7、嵌套选的:
            soup.html.body

    # -----了解-----------:

    1. # 子节点、子孙节点
    2. print(soup.p.contents) # p下所有子节点,只拿直接子节点
    3. print(soup.p.children) # 直接子节点 得到一个迭代器,包含p下所有子节点
    4. for i,child in enumerate(soup.p.children):
    5.     print(i,child)
    6. print(soup.p.descendants) #获取子孙节点,p下所有的标签都会选择出来  generator
    7. for i,child in enumerate(soup.p.descendants):
    8.     print(i,child)
    9. # 父节点、祖先节点
    10. print(soup.a.parent) #获取a标签的父节点
    11. print(list(soup.a.parents)) #找到a标签所有的祖先节点,父亲的父亲,父亲的父亲的父亲...
    12. # 兄弟节点
    13. print(soup.a.next_sibling) #下一个兄弟
    14. print(soup.a.previous_sibling) #上一个兄弟
    15. print(list(soup.a.next_siblings)) #下面的兄弟们=>生成器对象
    16. print(soup.a.previous_siblings) #上面的兄弟们=>生成器对象

    搜索文档树

    # 解析库:

    1. html_doc = """
    2. The Dormouse's story
    3. The Dormouse's story

    4. Once upon a time there were three little sisters; and their names were

    5. Lacie and
    6. and they lived at the bottom of a well.

    7. ...

    8. """
    9. from bs4 import BeautifulSoup
    10. soup = BeautifulSoup(html_doc, 'lxml')

    # 五种过滤器: 字符串、正则表达式、列表、True、方法
    1、字符串(和):

    1. res=soup.find(id='my_p')
    2. res=soup.find(class_='boldest')
    3. res=soup.find(href='http://example.com/elsie')
    4. res=soup.find(name='a',href='http://example.com/elsie',id='link1',class_='sister') # 多个是and条件
    5. # 可以写成
    6. # res=soup.find(attrs={'href':'http://example.com/elsie','id':'link1','class':'sister'})
    7. # print(res)

    2、正则表达式:

    1. import re
    2. res=soup.find_all(href=re.compile('^http'))
    3. res=soup.find_all(name=re.compile('^b'))
    4. res=soup.find_all(name=re.compile('^b'))
    5. print(res)

    3、列表(或):

    1. res=soup.find_all(name=['body','b','a'])
    2. res=soup.find_all(class_=['sister','boldest'])
    3. print(res)

    4、布尔:

    1. res=soup.find_all(id=True)
    2. res=soup.find_all(name='img',src=True)
    3. print(res)

    5、方法:

    1. def has_class_but_no_id(tag):
    2.     return tag.has_attr('class') and not tag.has_attr('id')
    3. print(soup.find_all(has_class_but_no_id))

    6、搜索文档树可以结合遍历文档树一起用

    1. res=soup.html.body.find_all('p')
    2. res=soup.find_all('p')
    3. print(res)

    7、find 和find_all的区别:find 就是find_all,只要第一个

    8、recursive=True   limit=1

    1. res=soup.find_all(name='p',limit=2) # 限制条数
    2. res=soup.html.body.find_all(name='p',recursive=False) # 是否递归查找
    3. print(res)

    css选择器

    # 解析库:

    1. html_doc = """
    2. The Dormouse's story
    3. The Dormouse's story

    4. Once upon a time there were three little sisters; and their names were

    5. Lacie and
    6. and they lived at the bottom of a well.

    7. ...

    8. """
    9. from bs4 import BeautifulSoup
    10. soup = BeautifulSoup(html_doc, 'lxml')

    # css 选择器:

    1. '''
    2. .类名
    3. #id
    4. body
    5. body a
    6. # 终极大招:css选择器,复制
    7. '''
    1. res=soup.select('a.sister')
    2. res=soup.select('p#my_p>b')
    3. res=soup.select('p#my_p b')
    4. print(res)
    5. import requests
    6. from bs4 import BeautifulSoup
    7. header={
    8.     'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36'
    9. }
    10. res=requests.get('https://www.zdaye.com/free/',headers=header)
    11. # print(res.text)
    12. soup=BeautifulSoup(res.text,'lxml')
    13. res=soup.select('#ipc > tbody > tr:nth-child(2) > td.mtd')
    14. print(res[0].text)

    今日思维导图:

  • 相关阅读:
    【FPGA】十进制计数器 | 实现 4-bit 2421 十进制计数器 | 有限状态机(FSM)
    【Codeforces Round #811 (Div. 3)】【题目解析+AK代码】
    英伟达两个最新元宇宙布局
    网络基础2(上):http协议、tcp/udp协议
    C++基础学习
    flutter学习之widget的显示和隐藏
    @WebFilter两种使用方法和失效解决方案
    Self-paced Multi-grained Cross-modal Interaction Modeling for Referring Expression Comprehension论文阅读
    Azure AD Domain Service(二)为域服务中的机器配置 Azure File Share 磁盘共享
    3. 文档概述(Documentation Overview)
  • 原文地址:https://blog.csdn.net/qq_48064830/article/details/136190121