mitmproxy爬逻辑思维文章

一、分析页面

首先,用命令行工具打开mitmweb,如图:

mitmweb

然后,将手动配置手机的代理服务器为PC机。

如何配置可以参考之前的文章https://www.cnblogs.com/xyztank/articles/12362470.html

接着,在手机打开想要爬取的软件“得到App”。

根据代理截获的数据,然后进行分析,最终定位文章地址列表:

https://entree.igetget.com/bauhinia/v1/class/purchase/article_list

然后,分析服务器返回的json数据,可以看到文章的标题及地址。

二、代码实现

from mitmproxy import ctx
import json
from lxml import etree
from selenium import webdriver

def response(flow):
    """
    利用mitmdump ui分析出页面url
    """
    start_url = "https://entree.igetget.com/bauhinia/v1/class/purchase/article_list"
    if flow.request.url.startswith(start_url):
        text = flow.response.text
        data = json.loads(text)
        talks = data.get('c').get('article_list')
        for talk in talks:
            title = talk.get('share_title')
            url = talk.get('share_url')
            ctx.log.info(str(title))
            parse_page(url)


def parse_page(url):
    """
    发现获得的url页面无法直接解析,
    进一步分析得出,页面信息是通过js渲染,
    但是浏览器又能正常显示页面,于是采用selenium方式爬取信息
    """
    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument("--headless")
    #通过headless设置,让浏览器不再显示
    driver = webdriver.Chrome(chrome_options=chrome_options)
    driver.get(url)
    resouce = driver.page_source
    html = etree.HTML(resouce)
    title = html.xpath('//h1[@class="title"]/text()')[0]
    time = html.xpath('//span[@class="time"]/text()')[0]
    content = html.xpath('//div[@class="text"]//p//text()')
    content = "".join(content)
    print(title, time)
    save(title, time, content)


def save(title,time,content):
    """
    保存至文本文件中
    """
    with open('dedao.txt','a',encoding='utf-8') as fp:
        fp.write('\n'.join([title,content,time]))
        fp.write('\n' + '='*50 + '\n')

windows平台命令行运行脚本:

mitmdump -s test_dedao.py

这里可以看到控制台正在不断的打印正在爬取的文章标题。

三、结果展示

当然,数据还可以保存在数据库中,这里偷个懒,就直接保存在txt文件中。

posted @ 2020-03-21 17:13  xyztank  阅读(188)  评论(0编辑  收藏  举报