爬虫数据分析(bs4,xpath,正则表达式)

1、bs4的BeautifulSoup函数的使用:将获取的网页格式的文本解析,之后获取想要的数据

from bs4 import BeautifulSoup
import requests

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36'}
url = "http://sanguo.5000yan.com/"
page_text = requests.get(url ,headers = headers).content
## 传入解析器:lxml 比如解析成中文 排版
soup = BeautifulSoup(page_text,'lxml')
#从解析之后的内容取值想要的内容: 有几种方式方法 --可搜索 <soup.select()函数的使用用法> 查看
li_list = soup.select('main > div > ul > li')
fp = open('./sanguo.txt','w',encoding='utf-8') #打开一个文件 如果没有的话就创建一个
for li in li_list:
    #下面这段的意思 <li class="menu-item"><a href="https://sanguo.5000yan.com/1083.html">第一百一十九回 假投降巧计成虚话 再受禅依样画</a></li>  ------->>>>> <a href="https://sanguo.5000yan.com/965.html">第一回 宴桃园豪杰三结义 斩黄巾英雄首立功</a> ----->>>>> 第一回 宴桃园豪杰三结义 斩黄巾英雄首立功
    title = li.a.string # 取a 里面的标题
    #取a中的网址 进行深入二度爬虫
    detail_url = li.a['href']
    detail_page_text = requests.get(detail_url,headers = headers).content
    detail_soup = BeautifulSoup(detail_page_text,'lxml') #传入解析器 解析排版
    div_tag = detail_soup.find('div',class_="grap") #抓取想要的内容
    content = div_tag.text
    fp.write(title+":"+content+'\n') #写入文件里面
    print(title,'爬取成功!!!')

2、xpath的使用

import requests
from lxml import etree
import os

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36'}
url = 'http://pic.netbian.com/4kmeinv/'
response = requests.get(url,headers = headers)
#response.encoding=response.apparent_encoding
#response.encoding = 'utf-8'
page_text = response.text
tree = etree.HTML(page_text)  #etree.HTML()可以用来解析字符串格式的HTML文档对象,将传进去的字符串转变成_Element对象。作为_Element对象,可以方便的使用getparent()、remove()、xpath()等方法。
print(tree)
# print(page_text)
li_list = tree.xpath('//div[@class="slist"]/ul/li')#文本如下所示
'''    <div class="slist">
       <ul class="clearfix">
        <li><a href="/tupian/28468.html" target="_blank"><img src="/uploads/allimg/211219/114328-1639885408db64.jpg" alt="º£ÇÙÑÌ Í¬ÈË cosplayÃÀÅ®4K¸ßÇå±ÚÖ½" /><b>º£ÇÙÑÌ Í¬ÈË cosplayÃÀÅ®</b></a></li>
      </ul>
    </div>
'''
if not os.path.exists('./picLibs'):
    os.mkdir('./picLibs')
for li in li_list:
    img_src = 'http://pic.netbian.com/'+li.xpath('./a/img/@src')[0] #获取网址 爬虫网页
    img_name = li.xpath('./a/img/@alt')[0]+'.jpg'
    img_name = img_name.encode('iso-8859-1').decode('gbk')#转换成中文
    img_data = requests.get(url = img_src,headers = headers).content
    img_path ='picLibs/'+img_name
    #保存图片
    with open(img_path,'wb') as fp:
        fp.write(img_data)
        print(img_name,"下载成功")

3、正则表达式 --分页爬取

import requests
import re
import os

if not os.path.exists('./qiutuLibs'):
    os.mkdir('./qiutuLibs')
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4385.0 Safari/537.36'
}

url = 'https://www.qiushibaike.com/imgrank/page/%d/'
for pageNum in range(1,3):
    new_url = format(url%pageNum)
    page_text = requests.get(new_url,headers = headers).text
    ex = '<div class="thumb">.*?<img src="(.*?)" alt.*?</div>'
    img_src_list = re.findall(ex,page_text,re.S)
    print(img_src_list)
    for src in img_src_list:
        src = 'https:' + src
        img_data = requests.get(url = src,headers = headers).content
        img_name = src.split('/')[-1]
        imgPath = './qiutuLibs/'+img_name
        with open(imgPath,'wb') as fp:
            fp.write(img_data)
            print(img_name,"下载完成!!!!!")

posted @ 2022-03-28 16:34  夙兴夜寐  阅读(147)  评论(0)    收藏  举报