requests、xpath应用案例

以后每天写一两篇文章,大概一个月左右能把以前学爬虫的笔记整理好,孬好就这样了,以后去工厂还是工地都无所谓了,不纠结到底做什么了,反正编程只是爱好~



爬豆瓣

import requests
from lxml import etree


'''1. 将目标网站上的页面抓取下来'''
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
    'Referer': 'https://movie.douban.com/'
}
url = 'https://movie.douban.com/cinema/nowplaying/hefei/'

response = requests.get(url, headers=headers)
text = response.text    # 豆瓣的代码比较正规,可以直接用text自动解码


'''2. 将抓取下来的数据提炼'''
html = etree.HTML(text)
ul = html.xpath('//ul[@class="lists"]')[0]      # ul标签不止一个所以这里带上[0]
lis = ul.xpath('./li')                          # 获取ul标签下的所有li标签

movies = []
for li in lis:          # 遍历出所有的li标签,并同时获取到li标签里面对应的片名,评分,片长等信息
    title = li.xpath('@data-title')[0]
    score = li.xpath('@data-score')[0]
    duration = li.xpath('@data-duration')[0]
    region = li.xpath('@data-region')[0]
    director = li.xpath('@data-director')[0]
    actors = li.xpath('@data-actors')[0]
    thumbamli = li.xpath('.//img/@src')[0]
    movie = {
        '片名': title,
        '评分': score,
        '片长': duration,
        '国家': region,
        '导演': director,
        '演员': actors,
        '海报': thumbamli,
    }
    movies.append(movie)

for i in movies:
    print(i)

爬电影天堂

from lxml import etree
import requests


BASE_DOMAIN = 'https://www.dytt8.net'
HEADERS = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
}


def get_detail_urls(url):        # 获取电影详情页url的函数
    response = requests.get(url, headers=HEADERS)
    # print(response.encoding)   # 查看requests模块当前自动解码使用的编码方式
    text = response.text         # 因为只是获取url链接所以这里用text,调用模块自己的解码,
    # 这个网站如果使用.content 自己指定编码会报错,因为这个网站里面有很多不规范的编码方式
    # 所以使用.text 让模块自己解码,如需要针对某一个页面或标签进行解码的时候可以单独解码:
    #                                 text = response.text.encode('gb2312').decode('gb2312')

    html = etree.HTML(text)
    detail_urls = html.xpath('//table[@class="tbspan"]//a/@href')
    # 直接一步获取class="tbspan"的table标签下的a标签的href属性
    detail_urls = list(map(lambda a: BASE_DOMAIN + a, detail_urls))
    return detail_urls


'''上面的map函数等价于:
def abc(a):                    先定义一个函数,参数a
    return BASE_DOMAIN + a     返回 BASE_DOMAIN + 参数a

index = 0
for detail_url in detail_urls:
    detail_url = abc(detail_url)   把列表detail_urls每次遍历出来的值作为上面函数的参数并调用执行这个函数
    detail_urls[index] = detail_url   把被这个函数糟蹋过的值按照原位改变赋值给列表detail_urls对应的下标
    index += 1
'''


def parse_detail_page(url):     # 获取详情页里的标题、导演演员等...
    movie = {}
    response = requests.get(url, headers=HEADERS)
    text = response.content.decode('gbk')

    html = etree.HTML(text)

    title = html.xpath('//div[@class="title_all"]//font[@color="#07519a"]/text()')[0]
    movie['片名'] = title

    zoomE = html.xpath('//div[@id="Zoom"]')[0]
    imgs = zoomE.xpath('.//img/@src')
    if len(imgs) > 1:
        cover = imgs[0]
        screenshot = imgs[1]
        movie['海报'] = cover
        movie['影片截图'] = screenshot

    infos = zoomE.xpath('.//text()')
    # 这里已经匹配到所有的影片信息了,所有内容包括换行符什么的全部放到列表里了
    # 所以下面要通过遍历查找出需要的影片信息
    # return infos

    def parse_info(info, rule):     # 用来去除空格和影片信息标题的函数
        return info.replace(rule, '').strip()
        # .replace()是替换字符串中指定子字符串(子文本替换);
        # .strip()方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列,注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符。

    for index, info in enumerate(infos):
        if info.startswith('◎年  代'):        # .startswith()是以什么什么开头
            info = parse_info(info, '◎年  代')
            movie['年代'] = info
        elif info.startswith('◎产  地'):
            info = parse_info(info, '◎产  地')
            movie['产地'] = info
        elif info.startswith('◎类  别'):
            info = parse_info(info, '◎类  别')
            movie['类别'] = info
        elif info.startswith('◎豆瓣评分'):
            info = parse_info(info, '◎豆瓣评分')
            movie['豆瓣评分'] = info
        elif info.startswith('◎片  长'):
            info = parse_info(info, '◎片  长')
            movie['片长'] = info
        elif info.startswith('◎导  演'):
            info = parse_info(info, '◎导  演')
            movie['导演'] = info
        elif info.startswith('◎编  剧'):
            info = parse_info(info, '◎编  剧')
            movie['编剧'] = info
        elif info.startswith('◎主  演'):
            info = parse_info(info, '◎主  演')
            actors = [info]  # 主演是每行一个的,所以要for循环遍历出所有演员;这里先把这个已经遍历出来的加到列表里
            for i in range(index + 1, len(infos)):
                # index是上面一层for循环记录当前遍历次数的,这里是想让上面的for循环一直遍历下去
                actor = infos[i].strip()            # .strip() 删除空格后赋值给actor
                if actor.startswith('◎'):          # 直到遇到开头为◎的字符,说明演员的信息遍历完了
                    break                           # 跳出循环
                actors.append(actor)                # 把遍历到的主演名字追加到列表里
            movie['主演'] = actors                  # 把结果(列表)放到字典表里
        elif info.startswith('◎简  介'):
            info = parse_info(info, '◎简  介')
            profiles = [info]                          # 简介前面有个换行,所以跟主演一样需要遍历
            for i in range(index + 1, len(infos)):
                profile = infos[i].strip()             # .strip() 删除空格后赋值给profile
                if profile.startswith('【下载地址】'):  # 直到遇到开头为【下载地址】的字符,说明简介的信息遍历完了
                    break                              # 跳出循环
                profiles.append(profile)               # 把遍历到的所有简介内容追加到列表里
            movie['简介'] = ''.join(profiles)          # 把结果(列表)以空白字符转换成字符串,放到字典表里

    download = html.xpath('//td[@style="WORD-WRAP: break-word"]/a/@href')[0]
    movie['下载地址'] = download
    return movie


def spider():         # 调用url函数和解析数据函数并执行爬虫
    base_url = 'https://www.dytt8.net/html/gndy/dyzz/list_23_{}.html'
    movies = []

    for i in range(1, 101):         # 控制页数的for循环
        url = base_url.format(i)    # 构造列表页的url
        print('第' + str(i) + '页电影如下:' + url)
        detail_urls = get_detail_urls(url)   # 执行获取详情页url链接的函数并赋值给detail_urls
        # print(detail_urls)

        for index, detail_url in enumerate(detail_urls):  # 遍历每一页所有电影详情页面的url的for循环
            movie = parse_detail_page(detail_url)         # 执行获取详电影情页内容的函数 传递每次遍历的url
            movies.append(movie)                          # 最终结果加入到列表里

            with open(r'C:\Users\Administrator\Desktop\movie.txt', 'a', encoding='utf-8') as f:
                f.write(str(movie) + '\n')

            print(movie)   # 遍历一次打印一次:字典表
        # print(movies)    # 打印所有加入到列表里后的结果:列表


if __name__ == '__main__':
    spider()

爬腾讯招聘

import requests
from lxml import etree


BSE_DOMAIN = 'https://hr.tencent.com/'
HEADERS = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
}


def get_detail_urls(url):            # 获取详情页url
    response = requests.get(url, headers=HEADERS)
    text = response.text

    html = etree.HTML(text)
    detail_urls = html.xpath('//table[@class="tablelist"]//tr[@class!="h" and @class!="f"]//a/@href')
    detail_urls = list(map(lambda a: BSE_DOMAIN + a, detail_urls))
    return detail_urls


def parse_detail_page(url):          # 解析招聘信息
    txzp = {}
    response = requests.get(url, headers=HEADERS)
    test = response.text
    # print(test)

    html = etree.HTML(test)

    title = html.xpath('//tr[@class="h"]/td/text()')[0]
    txzp['职位'] = title

    gznrs = html.xpath('//table[@class="tablelist textl"]//text()')
    # return gznrs

    for index, gznr in enumerate(gznrs):
        if gznr.startswith('工作地点:'):
            for i in range(index + 1, index + 2):
                gznr = gznrs[i].replace('工作地点:', '').strip()
                txzp['工作地点:'] = gznr
        elif gznr.startswith('职位类别:'):
            for i in range(index + 1, index + 2):
                gznr = gznrs[i].replace('职位类别:', '').strip()
                txzp['职位类别:'] = gznr
        elif gznr.startswith('招聘人数:'):
            for i in range(index + 1, index + 2):
                gznr = gznrs[i].replace('招聘人数:', '').strip()
                txzp['招聘人数:'] = gznr
        elif gznr.startswith('工作职责:'):
            gzzzs = []
            for i in range(index + 1, len(gznrs)):
                gzzz = gznrs[i].replace('工作职责:', '').strip()
                if gzzz.startswith('工作要求:'):
                    break
                gzzzs.append(gzzz)
            txzp['工作职责'] = ''.join(gzzzs)
        elif gznr.startswith('工作要求:'):
            gzyqs = []
            for i in range(index + 1, len(gznrs)):
                gzyq = gznrs[i].replace('工作要求:', '').strip()
                if gzyq.startswith('申请岗位'):
                    break
                gzyqs.append(gzyq)
            txzp['工作要求'] = ''.join(gzyqs)

    return txzp


def spider():                       # 执行爬虫
    base_url = 'https://hr.tencent.com/position.php?lid=&tid=&keywords=python&start={}'
    txzps = []
    for i in range(0, 91, 10):      # 0-91,间隔10递增:0 10 20 30 40 50 60 70 80 90
        url = base_url.format(i)    # 构造列表页url
        print(url)
        detail_urls = get_detail_urls(url)        # 获取每一列表页的详情页url
        # print(detail_urls)

        for detail_url in detail_urls:            # 遍历每一列表页的详情页url
            txzp = parse_detail_page(detail_url)  # 解析数据
            txzps.append(txzp)
            print(txzp)
        # print(txzps)


if __name__ == '__main__':
    spider()



这篇文章是我以前看知了课堂的21天搞定Python分布爬虫时的笔记
只是整理笔记,方便自己以后忘了回头再看,大神勿喷。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值