x車之家的配置資訊主要運用css3的偽類反爬,需要將正確值替換掉原來的類值就可以了。
獲取所有車系的id–seriesid 存入csv
獲取所有車系的介面
每個車系對應有不同的具體車的id–specid 存入csv 大約有38500個車每個車系對應的所有車的specid資訊介面
配置資訊的頁面url
提取頁面資訊,為接下來的拼接js做準備
匹配原始js裡需要提取的資訊
config = re.search(
"var config = (.*?)};"
, html, re.s)
# 車的引數
option = re.search(
"var option = (.*?)};"
, html, re.s)
# 主被動安全裝備
bag = re.search(
"var bag = (.*?)};"
, html, re.s)
# 選裝包
color = re.search(
"var color = (.*?)};"
, html, re.s)
# 外飾顏色
inner_color = re.search(
"var innercolor =(.*?)};"
, html, re.s)
# 內飾顏色
js_lists = re.findall(
'(\(function\([a-za-z].*?_\).*?\(document\);)'
, html)
拼接車型的所有引數car_info
car_info = car_info + config.group(0)
+ option.group(0)
+ bag.group(0)
+ color.group(0)
+ inner_color.group(
0)
封裝js,儲存為成本地html檔案
`dom =
("var rules = '2';"
"var document = {};"
"function getrules()"
"document.createelement = function() else "
" }"
" }"
" }"
"};"
"document.queryselectorall = function() ;"
"};"
"document.head = {};"
"var window = {};"
"window.decodeuricomponent = decodeuricomponent;"
)for item in js_lists:
dom = dom + item
html_type =
"" \
""# 待執行的js字串
with
open
("../htmlfile/js.html"
,"w"
, encoding=
"utf-8"
)as f:
f.write(js)`
通過selenium執行,用selenium執行本地的html檔案,js渲染後得到正確的資訊。
# 建立chrome引數物件
opt = options(
)opt.add_argument(
"--headless"
)browser = webdriver.chrome(options=opt,
executable_path=
"d:///learn/爬蟲練習/autohome/autohome/webdriver/chromedriver.exe"
)# 執行js的dom
browser.get(
"d:///learn/爬蟲練習/autohome/autohome/htmlfile/js.html"
)# 得到正確的對應值
true_text = browser.find_element_by_tag_name(
'body'
).text
用正確的值替換原來的值
# 匹配車輛引數中所有的span標籤
span_list = re.findall(
"", car_info)
# 按照span標籤與 true_text中的關鍵字進行替換
for span in span_list:
info = re.search(
"'(.*?)'"
, span)
if info:
class_info =
str(info.group(1)
)+"::before "
content = re.search(class_info, true_text)
.group(
1)
car_info = car_info.replace(
str(
"+ info.group(1)
+"'>"),
re.search(
"\"(.*?)\""
, content)
.group(1)
)
13.最後就是持久化。這裡有點麻煩,配置資訊太多,而且每個車的配置資訊都不盡相同。只能按照每個specid來提取配置資訊。
# 持久化
car_item =
config = re.search(
'var config = (.*?);var option'
, car_info)
.group(1)
option = re.search(
'var option = (.*?);var bag'
, car_info)
.group(1)
# bag = re.search('var bag = (.*?);var color', car_info).group(1)
color = re.search(
'var color = (.*?);var innercolor'
, car_info)
.group(1)
inner_color = re.search(
'var innercolor =(.*?);'
, car_info)
.group(
1)
最後儲存的結果是這樣
汽車之家的偽類反爬還是很厲害的,在參考網上大神的解法後弄了好久才爬取到資料。目前只是單執行緒在跑,速度很慢,後面繼續優化採用多執行緒。在此感謝這哥們
PYTHON爬取汽車之家資料
使用知識 使用說明 源 usr bin env python coding utf 8 time 2020 1 16 15 34 author wsx site file cars.py software pycharm import json from multiprocessing import...
Python練習 scrapy 爬取汽車之家文章
autohome.py spider檔案 coding utf 8 import scrapy from autohome.items import autohomeitem class autohomespider scrapy.spider name autohome allowed domai...
Python爬蟲之爬取動漫之家
python爬蟲之爬取動漫之家 小白上手爬蟲第一天,簡單爬取 動漫之家。小小目標 1.爬取5頁的動漫 2.以list返回其動漫位址和動漫名字 簡單粗暴,直接附上原始碼 import requests import re 獲取頁面 defgethtmltext url try kv r request...