IT编程导图/小工具(遥远的计划未来) 管理专栏 写文章

Python-爬虫基础-结合项目实际调试学习-爬虫框架、返爬知识

2019-11-28  本文已影响0人  MonkeyLei

简单做个总结吧。。这一两周主要是协助爬虫数据采集,同时利用项目来调试规则,找bug等。。当然从中也是利用到了之前的相关知识。。同时也学习了新的框架,新的库,新的xPath语法等。。。

项目大概样子(同事搞的,我也是后来者,像他学习)。。具体肯定不放出来代码了。。只是记录下,一个爬虫大概的样子,以及后续如何完善的思路,如何结合实际项目等。。

image

本地环境搭建过程,也是涉及到安装了很多环境,很多库,有些无法在线的我都是下载网友的的配套的。

1. 比如网页截图库 phantomjs:结合selenium import webdriver使用...

https://blog.csdn.net/qq_41895190/article/details/89741442

2 。 比如网页格式 &#xxx;字符串转汉子 https://www.zhihu.com/question/35020428

**3. **继续比如: win10+Python3.6+scrapy1.51的安装

https://blog.csdn.net/Fighting_Boom/article/details/81165127

这个在线安装不了,可以下载网友的盘上的https://pan.baidu.com/s/1lO4yr2euQTkbFGz_OvtCjg#list/path=%2F 很棒。。不然我得捣鼓许久了。。 这样就可以本地安装了。。。

又比如: 如何突破网站对selenium的屏蔽mitmproxy https://www.jianshu.com/p/304f4dfae0bb

总是如果你需要什么新技术,可能需要一个个去从头完善你的爬虫脚本。。等bug改完了,然后你要做的就是防止被返爬的技术,比如动态代理ip池买一波来用,另外就是webdriver,另外还有伪装用户信息,利用一些收费技术实现验证码自动验证跳转,然后在破解一些关于webdriver被识别的返爬问题。。。

真正要做这个东东,行业,肯定需要你深入更多机制,原理,规则!!!!

另外我自己也是会搞点小测试脚本来调试xPath规则等。。

xPathTest.py - 这个测试的当前网页和规则就出现了被返爬的情况,浏览器无法加载显示网页内容。但是启动我们的浏览器的话就ok。。。。仅供测试学习,非其他恶意用途!

#!/usr/bin/python3
# -*- coding: UTF-8 -*-
# 文件名:xPathTest.py
# 描述:xPath规则测试脚本

import time
from urllib import request
from lxml import etree
from concurrent.futures import ThreadPoolExecutor, as_completed
from selenium import webdriver
import selenium.webdriver.support.ui as ui
from selenium.webdriver.chrome.options import Options
from selenium.common.exceptions import UnexpectedAlertPresentException
import html

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36'
}
browser = None
chrome_options = None

# 获取静态内容
def get_html_data(url_path):
    data_html = ''
    req = request.Request(url_path, None, headers)
    try:
        with request.urlopen(req) as uf:
            while True:
                data_temp = uf.read(1024)
                if not data_temp:
                    break
                data_html += data_temp.decode('gbk', 'ignore')
    except Exception as err:
        print('get_html_data', err)
    return data_html

# 通过启动浏览器获取动态页面内容
def get_html_data_bybrowser(url_path):
    data_html = ''
    try:
        # 浏览器静默加载页面后等待10s(这个页面加载后后续还有很多js要执行,所以我们需要时间获取最终页面)
        wait = ui.WebDriverWait(browser, 10)
        # 获取页面+包含诸多js
        browser.get(url_path)
        # 通过向下拉取网页,使其将页面加载完整 - 感觉没用! - 等待ajax   首先通过搜索页面,没有webdriver的相关判断,所以大概率排除是一般的反爬虫机制
        # js = "var q=document.documentElement.scrollTop=100000"
        # for i in range(3):
        #     browser.execute_script(js)
        #     time.sleep(2)
        # 如果等待页面加载完成,直接返回无需再等待
        wait.until(lambda driver: driver.page_source)
        data_html = browser.page_source
        # 当前页面可以下载下来,里面调用了一些js来加载数据鸭
        # html = browser.page_source
        # if html:
        #     print(html.encode("utf8"))
        #     with open('./1.html', mode='w', encoding='utf-8') as f:
        #         f.write(html)
    except Exception as err:
        print('get_html_data', err)
    return data_html

def init_browser():
    # 启动参数
    chrome_option = Options()
    prefs = {
        'profile.default_content_setting_values': {
            'images': 2,  # 禁用图片的加载
            # 'javascript': 2  # 禁用js,可能会导致通过js加载的互动数抓取失效
        }
    }
    chrome_option.add_experimental_option("prefs", prefs)
    # chrome_option.add_argument('--headless')  # 使用无头谷歌浏览器模式
    chrome_option.add_argument('--disable-dev-shm-usage')
    chrome_option.add_argument('--no-sandbox')
    chrome_option.add_argument("window-size=1024,768")
    chrome_option.add_argument('--disable-gpu')
    chrome_option.add_argument('blink-settings=imagesEnabled=false')
    # https://blog.csdn.net/dichun9655/article/details/93790652 - 返爬的方式
    # chrome_option.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
    return chrome_option

def get_xpath(htmldata, ruler):
    print('get_xpath 页面内容:', htmldata)
    print('get_xpath 规则:', ruler)
    # 转换为html对象,以便进行path查找
    html_object = etree.HTML(htmldata)
    # 补全网页吧
    last_html_data = etree.tostring(html_object)
    # 再次转换为html对象,以便进行path查找
    html_object = etree.HTML(last_html_data)
    # 解析规则,获取数据
    if len(html_object):
        parse_data = html_object.xpath(ruler)
        if parse_data:
            # @sigle 取单个就行
            print('get_xpath parse_data:', parse_data)
            print('get_xpath parse_data len:', len(parse_data))
            # @special 特别的取被注释掉的文件
            if 'node()' in ruler:
                # TODO 转码前需要过滤掉<!-- <h3></h3> -->, 保留纯类似格式:&#19990;&#30028;ABCddddd&#20320;&#22909;
                new_data = decode_html(parse_data[0])
                print('get_xpath 抓取规则内容node():', new_data)
            else:
                print('get_xpath 抓取规则内容:', parse_data[0])
                # print('get_xpath 抓取规则内容:', parse_data[0].text)
            # @multi 多个需要循环
            # for item in parse_data:
            #     if 'node()' in ruler:
            #         # print(item)
            #         new_data = decodeHtml(item)
            #         print(new_data)
            #     else:
            #         print(item.text)
        else:
            print('getXPath:', '解析规则未生效!')
    else:
        print('getXPath:', '页面为空!')

# 解析Unicode编码
def decode_html(input):
    s = html.unescape(input)
    return s

if __name__ == '__main__':
    chrome_options = init_browser()
    browser = webdriver.Chrome(chrome_options=chrome_options)
    url = 'http://beijing.chinatax.gov.cn/bjswjwz/qswj/cy/tzgg/tzgg/index.html'
    # rule = '//div[@id="cont"]/node()'
    rule = '//*[@id="infor_right_con"]/ul/li/span/text()'
    html_data = get_html_data_bybrowser(url)
    get_xpath(html_data, rule)
    # browser.quit()

环境缺的之前文章可以参考安装。。。一般提示intstall就可以安装...不行再搞其他办法。。

image

至于怎么返爬,自己学习研究吧。。但是不要没事做一些恶意操作哦。。。

上一篇 下一篇

猜你喜欢

热点阅读