最近一个好朋友在搞爬虫,问了很多问题,所以干脆直接写了一个范例。
这个程序整体要两次解析网页:
第一层是分析网页中的json数据来获取qtid,
第二层是用qtid来解析获得问答所在的网页
因为在问答网页里的数据存储是引用的数据库中的数据,所以不得已选择了低效的selenium模式
没时间分析了orz 有空再分析一下吧
# -*- coding:utf-8 -*-
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import urllib
import time
import requests
import json
from jsonpath import jsonpath #从jsonpath库中导入jsonpath方法
time_start=time.time()
chrome_options=Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('User-Agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36"')
#driver.get_cookie('COOKIE=sid=0f1f6197-de86-449b-b3d6-5508951fce35')
def get_url(n):#第一层解析json数据网页
url='http://online.10086.cn/bbs/front/sh/postdetails!list?uid=faqs001&pageno='+str(n)+'&proCode=&endTime=&beginTime=&sortType='
return url
def url_get1(qtid):#第二层解析目标问答网页
url='http://online.10086.cn/bbs/question/'+str(qtid)+'.html?qtid='+str(qtid)+'&userimgurl=style/tu4.gif'
return url
headers={'Cookie':'sid=0f1f6197-de86-449b-b3d6-5508951fce35',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36',
'Referer':'http://online.10086.cn/bbs/faqs/faqsIndex.html?link=faqslink'
}
n=1
while(n<20):
response=requests.post(get_url(n),headers=headers)
result=json.loads(response.text)
qtid = jsonpath(result, '$..qtid')//获取qtid
n+=1
a=0
while(a<10):
driver = webdriver.Chrome(options=chrome_options)
driver.get(url_get1(qtid[a]))
title=driver.find_elements_by_css_selector('#doc-bd-c > div.contain_right.clearfix.fl > div > div.invitation_con > p > span.typename')
img=driver.find_elements_by_css_selector('#doc-bd-c > div.contain_right.clearfix.fl > div > div.invitation_con > h1 > span:nth-child(3)')
content=driver.find_elements_by_css_selector('#doc-bd-c > div.contain_right.clearfix.fl > div > div.invitation_con > div.invitation_content > p:nth-child(1)')
for x,y,z in zip(title,img,content):
data={'class':x.text,
'title':y.text,'content':z.text}
print(data)
a += 1
driver.close()
time_over=time.time()
print(time_over-time_start)