Python-爬虫基础-结合项目实际调试学习-爬虫框架、返爬知识
简单做个总结吧。。这一两周主要是协助爬虫数据采集,同时利用项目来调试规则,找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> -->, 保留纯类似格式:世界ABCddddd你好
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至于怎么返爬,自己学习研究吧。。但是不要没事做一些恶意操作哦。。。