Python-爬虫基础-结合项目实际调试学习-爬虫框架、返爬知识、xPath规则调试、html编码等

简单做个总结吧。。这一两周主要是协助爬虫数据采集,同时利用项目来调试规则,找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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354

推荐阅读更多精彩内容