爬蟲實戰專案-公眾號:AI悅創

AI悅創發表於2020-04-05

www.zybuluo.com/Cleland/not…

你好,我是悅創。

部落格文章:www.aiyc.top/archives/24…

實戰專案一:爬取西刺代理(獲取代理IP)

爬蟲的學習就是與反扒措施、反扒系統做鬥爭的一個過程,而使用代理 IP 是我們重要的防反扒的重要措施,代理 IP 的來源有兩種。 一是:你花錢去購買商家會給你提供一個介面你直接呼叫就可以了,二是:自己在網上爬取高效IP。在這篇部落格中我重點給大家講一下如何從網上獲取高效IP,我們下面的IP來源於西刺代理,這是我很久之前寫的一篇部落格,今天來進行“翻新”一番希望可以幫助到大家。

1. 安裝必要的第三方庫

BeautifulSouprequests,BeautifulSoup 負責解析 HTML 網頁原始碼,requests 負責傳送請求來獲取網頁原始碼,BeautifulSouprequests 均屬於 Python 爬蟲的基礎庫,可以通過pip安裝。開啟命令列輸入命令 pip install BeautifulSoup4pip install requests 進行安裝:

在這裡插入圖片描述
過後在輸入命令 pip list 在 pip 安裝包列表中檢查 BeautifulSouprequests 庫是否安裝成功。
在這裡插入圖片描述

2. 分析網頁結構

待續。。。。

3. 完整程式碼

#IP地址取自國內髙匿代理IP網站:http://www.xicidaili.com/nn/  
from bs4 import BeautifulSoup
import requests,random

def get_ipInfors(url, headers):
	'''
	爬取IP資料,單個IP資訊以json格式儲存,所有json格式的IP資料資訊放入列表中
	return:ip_infor
	'''
	web_data = requests.get(url, headers=headers)
	soup = BeautifulSoup(web_data.text, 'lxml')
	nodes = soup.find_all('tr')

	for node in nodes[1:]:
		ip_ = node.find_all('td')
		ip_address = ip_[1].text
		ip_port = ip_[2].text
		ip_type = ip_[5].text
		ip_time = ip_[8].text

	ip_infors = {
		"ip_address" : ip_address,
		"ip_port" : ip_port,
		"ip_type" : ip_type,
		"ip_time" : ip_time
	}
	return ip_infors

def write_ipInfors(ip_infors):
	'''
	將IP資料寫入檔案中
	'''
	for ip_infor in ip_infors:
		f=open('IP.txt','a+',encoding='utf-8')
		f.write(ip_infors)
		f.write('\n')
		f.close()

if __name__ == '__main__':
	for i in range(1,10):
		url = 'https://www.xicidaili.com/nn/{}'.format(i)
		headers = {
			'Host': 'www.xicidaili.com',
			'Referer': 'https://www.xicidaili.com/',
			'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36'
		}
		ip_infors = get_ipInfors(url, headers=headers)
		proxies = write_ipInfors(ip_infors)
複製程式碼

實戰專案二:實現CSDN自動點贊

環境: Python3.6.5 編譯器: Sublime Text 3 程式碼: GitHub 第三方庫: selenium

文章目錄

一、思路 二、程式碼實現 (一)匯入第三方庫 (二)登入賬號 (三)儲存cookies到檔案中 (四)讀取並傳入cookies (五)實現自動點贊 三、完整程式碼 四、後記

一、思路 在CSDN中,如果實現自動點贊,就必須登入,這就避免不了和 selenium 打交道。Selenium 是一個WEB自動化測試工具,在Python中常用於模擬登陸的實現 實現 CSDN 自動點贊分以下幾個步驟:

  1. 登入賬號
  2. 獲取並儲存 cookies
  3. 讀取並傳入 cookies
  4. 實現自動點贊

二、程式碼實現

(一)匯入第三方庫

對於 selenium 還沒安裝的童鞋可以用在命令列中安裝

pip install selenium
複製程式碼
import time,json,random
from selenium import webdriver
複製程式碼

(二)登入賬號

在 selenium 安裝完成後,需要下一個驅動器(即 chromedriver.exe) 【谷歌驅動器下載】

而後執行程式碼

driver = webdriver.Chrome(executable_path='chromedriver.exe')
driver.get("https://passport.csdn.net/account/login")
複製程式碼

可以看到彈出 CSDN 的登入介面

在這裡插入圖片描述
CSDN 登入介面

我們這裡採用的是賬號密碼登入方式,我們再來做一個切換,點選“賬號登入”

time.sleep(3)
#進入賬號密碼登入介面
driver.find_element_by_xpath("//a[@class='login-code__open js_login_trigger login-user__active']").click()
time.sleep(3)
複製程式碼

看到如下介面

在這裡插入圖片描述
賬號登入介面

最後我們清空賬號密碼框,將自己的 CSDN 賬號密碼輸入進去即可

#清空賬號框中的內容
driver.find_element_by_xpath("//input[@name='username']").clear()
print("賬號框清空完成")
#自動填入登入使用者名稱
driver.find_element_by_xpath("//form[@id='fm1']/input[@name='username']").send_keys(account_CSDN)
print("賬號輸入完成")
#清空密碼框中的內容
driver.find_element_by_xpath("//input[@name='password']").clear()
#自動填入登入密碼
driver.find_element_by_xpath("//input[@name='password']").send_keys(password_CSDN)
time.sleep(3)
#點選登入
driver.find_element_by_xpath("//input[@class='logging']").click()
複製程式碼

大家可能也注意到了我程式碼上用了很多time.sleep()進行休眠,這個是為了給伺服器一個反應時間。拿輸入賬號密碼後的登入操作來舉例,如果你在輸入賬號密碼後立即登入,系統會報出賬號密碼錯誤的提起,這個是由於我們程式碼輸入賬號密碼的速度太快了,伺服器還沒接收到你輸入的資訊,程式碼就已經登入操作了,它自然會給你報錯。當然人工輸入是不會遇到這個問題的,你速度沒那麼快嘛。

(三)儲存cookies到檔案中

在介紹下面的內容前,我先來介紹幾個知識點

  • json.loads() 是將str轉化成dict格式
  • json.dumps() 是將dict轉化成str格式。
  • json.dump(dict,fp) 把 dict 轉換成str型別存到fp指向的檔案裡。
  • json.load(fp) 把 fp 指向的檔案裡的內容讀取出來。
#獲取並儲存cookies
cookies = driver.get_cookies()
with open("cookies.txt", "w") as fp:
	json.dump(cookies, fp)
複製程式碼

(四)讀取並傳入cookies

這裡我麼將事先存入cookies.txt檔案中的cookies提取出來載入進去即可。這裡我補充一些webdriver中提供了操作cookie的相關方法:

  • get_cookies()    獲得 cookie 資訊
  • add_cookie(cookie_dict) 新增 cookie
  • delete_cookie(name) 刪除特定(部分)的cookie
  • delete_all_cookies() 刪除所有的cookie
driver = webdriver.Chrome(executable_path='chromedriver.exe')
driver.get("https://blog.csdn.net/qq_38251616/article/details/82963395")
with open("cookies.txt", "r") as fp:
	cookies = json.load(fp)
	for cookie in cookies:
		driver.add_cookie(cookie)
複製程式碼

(五)實現自動點贊

driver.get("https://blog.csdn.net/qq_38251616/article/details/82963395")
time.sleep(3)
driver.find_element_by_xpath("//button[@class=' low-height hover-box btn-like ']").click()
print("點贊完成!")
time.sleep(3)
複製程式碼

完。。。。

三、完整程式碼

#CSDN自動點贊

import time,json,random
from selenium import webdriver

#CSDN賬號
account_CSDN = "你的賬號"
#CSDN密碼
password_CSDN = "你的密碼"

def CSDN_login():
	'''
	登入CSDN並儲存cookies
	'''
	driver = webdriver.Chrome(executable_path='chromedriver.exe')
	driver.get("https://passport.csdn.net/account/login")
	time.sleep(3)
	#進入賬號密碼登入介面
	driver.find_element_by_xpath("//a[@class='login-code__open js_login_trigger login-user__active']").click()
	time.sleep(3)
	#清空賬號框中的內容
	driver.find_element_by_xpath("//input[@name='username']").clear()
	print("賬號框清空完成")
	#自動填入登入使用者名稱
	driver.find_element_by_xpath("//form[@id='fm1']/input[@name='username']").send_keys(account_CSDN)
	print("賬號輸入完成")
	#清空密碼框中的內容
	driver.find_element_by_xpath("//input[@name='password']").clear()
	#自動填入登入密碼
	driver.find_element_by_xpath("//input[@name='password']").send_keys(password_CSDN)
	time.sleep(3)
	#點選登入
	driver.find_element_by_xpath("//input[@class='logging']").click()

	#獲取並儲存cookies
	cookies = driver.get_cookies()
	with open("cookies.txt", "w") as fp:
		json.dump(cookies, fp)


def dianZan(url_list):
	'''
	實現自動點贊功能
	'''
	driver = webdriver.Chrome(executable_path='chromedriver.exe')
	driver.get("https://blog.csdn.net/qq_38251616/article/details/82963395")
	with open("cookies.txt", "r") as fp:
		cookies = json.load(fp)
		for cookie in cookies:
			driver.add_cookie(cookie)

	print("cookies載入完成,成功登入")
	time.sleep(3)
	driver.get("https://blog.csdn.net/qq_38251616/article/details/82963395")
	time.sleep(3)
	driver.find_element_by_xpath("//button[@class=' low-height hover-box btn-like ']").click()
	print("點贊完成!")
	time.sleep(3)

if __name__ == '__main__':
	url_list = ""
	CSDN_login()
	dianZan(url_list)
複製程式碼

四、後記

如果覺得我寫得可以點個讚唄;如果有什麼不足的地方,還你希望可以在下方留言告訴我。

實戰專案三:爬取QQ群中的人員資訊

文章目錄

一、selenium簡介 (一)例項說明 (二)元素定位方式 (三)實現滾動條自動下拉 二、Xpath簡介 (一)語法: (二)例項: 三、定義一個爬蟲類 (一)匯入包 (二)初始化類 (三)滾動條自動下拉 (四)獲取Tbody標籤的列表 (五)解析Tbody標籤 (六)提取Tbody標籤中每個群員的資訊 (七)將提取到群員的資訊寫入檔案 四、主函式

一、selenium簡介

我們模擬登陸用的是 selenium 庫,selenium 是一個自動化測試工具,在爬蟲中通常用來進行模擬登陸。

(一)例項說明

from selenium import webdriver
 
driver = webdriver.Chrome()
driver.get('http://www.baidu.com/')
複製程式碼

程式碼功能:

  1. 開啟谷歌瀏覽器,
  2. 自動輸入百度網址並開啟百度

如果程式執行錯誤,瀏覽器沒有開啟,那麼應該是沒有裝 Chrome 瀏覽器或者 Chrome 驅動沒有配置在環境變數裡。下載驅動,然後將驅動檔案路徑配置在環境變數即可。 谷歌瀏覽器驅動下載

(二)元素定位方式

單個元素選取:

find_element_by_id
find_element_by_name
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector
複製程式碼

多個元素選取:

find_elements_by_name
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector
複製程式碼

程式碼示例:

#獲取網頁中的h1標籤
h1 = driver.find_element_by_name("h1")
#獲取網頁中所有的h1標籤
h1_list = driver.find_elements_by_name("h1")
複製程式碼

(三)實現滾動條自動下拉

程式碼展示:

#將滾動條移動到頁面的底部
js="var q=document.documentElement.scrollTop=100000"  
driver.execute_script(js) 
複製程式碼

二、Xpath簡介

XPath 是一門在 XML 文件中查詢資訊的語言。XPath 可用來在 XML 文件中對元素和屬性進行遍歷。結構關係包括 父、子、兄弟、先輩、後代等。

(一)語法:

表示式 功能描述
nodename 選取此節點的所有子節點
/ 從根節點選取。
// 從匹配選擇的當前節點選擇文件中的節點,而不考慮它們的位置。
. 選取當前節點。
選取當前節點的父節點。
@ 選取屬性。
萬用字元 描述
* 匹配任何元素節點。
@* 匹配任何屬性節點。
node() 匹配任何型別的節點。

(二)例項:

路徑表示式 結果
bookstore 選取 bookstore 元素的所有子節點。
/bookstore 選取根元素 bookstore。註釋:假如路徑起始於正斜槓( / ),則此路徑始終代表到某元素的絕對路徑!
bookstore/book 選取屬於 bookstore 的子元素的所有 book 元素。
//book 選取所有 book 子元素,而不管它們在文件中的位置。
bookstore//book 選擇屬於 bookstore 元素的後代的所有 book 元素,而不管它們位於 bookstore 之下的什麼位置。
//@lang 選取名為 lang 的所有屬性。
路徑表示式 結果
/bookstore/* 選取 bookstore 元素的所有子元素。
//* 選取文件中的所有元素。
//title[@*] 選取所有帶有屬性的 title 元素。

更多語法知識參考:Xpath實現資訊提取

程式碼例項:

#獲取 class 為 bold 的標籤名
result = html.xpath('//*[@class="bold"]')
複製程式碼

三、定義一個爬蟲類

(一)匯入包

import time
from selenium import webdriver
複製程式碼

(二)初始化類

class qqGroupSpider():
    '''
    Q群爬蟲類
    '''
    def __init__(self, driver,qq,passwd,qqgroup):
        '''
        初始化根據使用者資訊登入到Q群管理介面
        :param driver:
        :param qq:
        :param passwd:
        :param qqgroup:
        :param writefile:
        '''
        url = "https://qun.qq.com/member.html#gid={}".format(qqgroup)
        self.driver=driver
        driver.delete_all_cookies()
        driver.get(url)
        time.sleep(1)
        driver.switch_to.frame("login_frame")  # 進入登入iframe
        time.sleep(1)
        change = driver.find_element_by_id("switcher_plogin")
        change.click()
        driver.find_element_by_id('u').clear()  # 選擇使用者名稱框
        driver.find_element_by_id('u').send_keys(qq)
        driver.find_element_by_id('p').clear()
        driver.find_element_by_id('p').send_keys(passwd)
        driver.find_element_by_class_name("login_button").click()
        time.sleep(1)
複製程式碼

(三)滾動條自動下拉

    def scroll_foot(self,driver):
        '''
        控制螢幕向下滾動到底部
        :param driver:
        :return:
        '''
        js = "var q=document.documentElement.scrollTop=100000"
        return driver.execute_script(js)
複製程式碼

(四)獲取Tbody標籤的列表

def getTbodyList(self, driver):
        print("getTbodyList()函式執行過")
        return driver.find_elements_by_xpath('//div[@class="group-memeber"]//tbody[contains(@class,"list")]')
複製程式碼

(五)解析Tbody標籤

def parseTbody(self, html):
        '''
        解析tbody裡面的內容,一個tbody裡面有多個成員,
        解析完成後,返回成員基本情況的列表
        :param html:
        :return:
        '''
        # selector = etree.HTML(html)
        print("parseTbody()函式執行過")
        memberLists = []
        for each in html:
            memberList = each.find_elements_by_xpath('tr[contains(@class,"mb mb")]')
            memberLists += memberList

        print("memberLists長度為:{}".format(len(memberLists)))
        memberLists_data = []
        for each in memberLists:   
            memberLists_data.append(self.parseMember(each))
        return memberLists_data
複製程式碼

(六)提取Tbody標籤中每個群員的資訊

def parseMember(self, mb):
        '''
        解析每個人各項描述,以逗號隔開,返回一個成員的基本情況
        :param mb:
        :return:
        '''
        print("parseMember()函式執行過")

        td = mb.find_elements_by_xpath('td')
        print("td長度為:{}".format(len(td)))

        qId = td[1].text.strip()
        nickName = td[2].find_element_by_xpath('span').text.strip()
        card = td[3].find_element_by_xpath('span').text.strip()
        qq = td[4].text.strip()
        sex = td[5].text.strip()
        qqAge = td[6].text.strip()
        joinTime = td[7].text.strip()
        lastTime = td[8].text.strip()

        a = (qId + "|" + qq + "|" + nickName + "|" + card + "|" + sex + "|" + qqAge + "|" + joinTime + "|" + lastTime)
        print(a)
        return a
複製程式碼

(七)將提取到群員的資訊寫入檔案

    def parseAndWrite(self, tbody):
        '''
        解析HTML中的tbody,解析完成後寫入到本地檔案
        :param tbody:
        :return:
        '''
        print("parseAndWrite()函式執行過")

        memberList = self.parseTbody(tbody)

        with open("1607.csv", 'a+', encoding="utf-8") as f:
            for each in memberList:
                f.write(str(each)+"\n")

複製程式碼

四、主函式

def main():
    qq = "你的QQ賬號"
    passwd = "你的QQ密碼"
    qqgroup = "想要爬取的QQ群群號"
    
    driver = webdriver.Chrome()
    spider=qqGroupSpider(driver,qq,passwd,qqgroup)
    time.sleep(10)
    # 找到QQ群的人數
    qqNum = int(driver.find_element_by_xpath('//*[@id="groupMemberNum"]').text.strip())
    print("QQ群人數為:"+str(qqNum))
    curren_qq_num=0
    prelen=0

    
    while curren_qq_num != qqNum:
        curren_qq_num=len(driver.find_elements_by_xpath('//*[@id="groupMember"]//td[contains(@class,"td-no")]'))
        #不停的向下滾動螢幕,直到底部
        spider.scroll_foot(driver)
        #每次滾動休息1秒
        time.sleep(1)
     
        tlist = spider.getTbodyList(driver)

        spider.parseAndWrite(tlist[prelen:])

        prelen = len(tlist)#更新tbody列表的長度

    driver.quit()

if __name__ == '__main__':
    main()
複製程式碼

實戰專案四:爬取911網站

這是我在某個專案寫的一份爬蟲程式碼,今天將它整理一下分享給大家,僅供參考學習,請勿用作其他用途。

需要爬取的東西

我爬取的是 myingwenming.911cha.com 網站,採集的是網站中的中文音譯、名字性別、來源語種、名字寓意、名字印象、名字含義6個資料。我分別設定 namesChineseTransliteration、namesGender、namesFromLanguage、namesMoral、namesImpression、namesMeaning 等6個欄位來存放相應的資料。

在這裡插入圖片描述

防反扒措施

在這防反扒這一塊我選擇每傳送一次 requests 請求更換一個 User-AgentIPUser-Agent 的更換我依靠第三方庫 fake_useragent 來完成,在每次傳送 requests 請求前通過 {'User-Agent':str(UserAgent().random)} 語句來獲取一個隨機 User-Agent。關於 代理 IP 這塊我則是事先準備好IP存放到 IP.txt 檔案中,每一次傳送 requests 前從該檔案中隨機獲取一個IP 用於本次請求。

def get_ip_list():
	'''
	讀取IP.txt中的資料
	'''
	f=open('IP.txt','r')
	ip_list=f.readlines()
	f.close()
	return ip_list

def get_random_ip(ip_list):
	'''
	從IP列表中獲取隨機IP
	'''
	proxy_ip = random.choice(ip_list)
	proxy_ip=proxy_ip.strip('\n')
	proxies = {'http': proxy_ip}
	return proxies

複製程式碼

關於 requests 請求 我這裡的requests請求供包含url、proxies、headers、timeout、verify五個引數,在每一次傳送請求前更換新的proxies,headers並在超時處理,若請求時間超過10秒則中斷本次請求,設定verify=False則會忽略對網頁證照的驗證。

在我遇到的反扒系統中有這樣一種,拿出來和大家分享。對方識別到你的爬蟲在網站上爬行時,不會阻止它的爬取行為而是讓其陷入一種死迴圈轉態,表現的形式是:本報錯同時也不會返回任何資料。在 requests 請求中加上一個超時設定就可以很好避開該反扒措施。

關於網頁解析 在網頁解析這塊我選擇的是 Python 解析庫 BeautifulSoup4 與解析器 lxml ,在定位方面我選擇的是 find()find_all()find() 返回的是單個結點,find_all() 返回結點列表,在提取文字資訊中我這裡使用的是 get_text()

首先定位到 <div class="pp"> ,其次是 div 下的 p 標籤,最後分別存入對應的欄位當中。

soup = BeautifulSoup(r.text, 'lxml')
body = soup.find("div", class_="pp")
contents = body.find_all('p')
複製程式碼

在這裡插入圖片描述

完整程式碼

from fake_useragent					import UserAgent
from bs4							import	BeautifulSoup
import pandas						as pd
import requests,csv,time,random

def get_ip_list():
	'''
	讀取IP.txt中的資料
	'''
	f=open('IP.txt','r')
	ip_list=f.readlines()
	f.close()
	return ip_list

def get_random_ip(ip_list):
	'''
	從IP列表中獲取隨機IP
	'''
	proxy_ip = random.choice(ip_list)
	proxy_ip=proxy_ip.strip('\n')
	proxies = {'http': proxy_ip}
	return proxies

def parsePage(url,ip_list):
	'''
	爬取網頁並返回所需資訊以及狀態碼
	'''
	headers= {'User-Agent':str(UserAgent().random)}
	proxies = get_random_ip(ip_list)
	try:
		#verify設定為False,Requests也能忽略對SSL證照的驗證。
		r = requests.get(url, proxies=proxies, headers=headers, timeout=10,verify=False)
	except:
		print('執行錯誤,程式暫停20秒')
		time.sleep(20)
		headers= {'User-Agent':str(UserAgent().random)}
		proxies = get_random_ip(ip_list)
		r = requests.get(url, proxies=proxies, headers=headers, timeout=10, verify=False)
	#狀態碼status_code為200代表爬取成功,為404則為未爬取到相關資訊
	if r.status_code == 200:
		soup = BeautifulSoup(r.text, 'lxml')
		body = soup.find("div", class_="pp")
		contents = body.find_all('p')
		return r.status_code, contents
	else:
		return r.status_code, None

def getDict(contents):
	namesChineseTransliteration = []        #中文音譯
	namesGender = []        #名字性別
	namesFromLanguage = []      #來源語種
	namesMoral = []         #名字寓意
	namesImpression = []        #名字印象
	namesMeaning = []           #名字含義

	namesChineseTransliteration.append(contents[1].get_text()[4:])
	namesGender.append(contents[-5].get_text()[4:])
	namesFromLanguage.append(contents[-4].get_text()[4:])
	namesMoral.append(contents[-3].get_text()[4:])  
	namesImpression.append(contents[-2].get_text()[4:])
	namesMeaning.append(contents[-1].get_text()[4:])
	str_row=namesChineseTransliteration+namesGender+namesFromLanguage+namesMoral+namesImpression+namesMeaning
 
	return str_row
 
def write_file(filePath, row):
	with open(filePath,'a+',encoding='utf-8',newline='') as csvfile:
		spanreader = csv.writer(csvfile,delimiter='|',quoting=csv.QUOTE_MINIMAL)
		spanreader.writerow(row)

if __name__ == "__main__":
	names = pd.read_csv("name_data.csv")['name']					#獲取需要爬取檔案的名字
	base_url = "https://myingwenming.911cha.com/"
	ip_list = get_ip_list()
	
	for name in names:
		url = base_url + name + ".html"

		status_code, contents = parsePage(url,ip_list)

		print("{}檢索完成".format(name), "狀態碼為:{}".format(status_code))
		#狀態碼為200爬取成功,狀態碼為404爬取失敗
		if status_code == 200:
			str_row = getDict(contents)
			row = ["{}".format(name)] + str_row
			write_file("new.csv",row)
		else:
			continue

複製程式碼

有不明的地方在下方留言,我看到後會儘快回覆的

實戰專案五:抓取簡書文章資訊

原始碼:

from fake_useragent 			import UserAgent
from lxml 						import etree
import lxml,requests


url="https://www.jianshu.com/c/qqfxgN?utm_campaign=haruki&utm_content=note&utm_medium=reader_share&utm_source=qq"

def getHtml(url):
	'''
	獲取網頁原始碼
	return html
	'''
	headers = {
		"Host": "www.jianshu.com",
		"Referer": "https://www.jianshu.com/",
		"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
	}

	req = requests.get(url, headers=headers)

	html = etree.HTML(req.text)

	return html

def parse(html):
	'''
	解析網頁
	'''
	nodes = html.xpath("//ul[@class='note-list']/li//div[@class='content']")

	for node in nodes:

		title = node.xpath(".//a[@class='title']/text()")[0]
		nickname = node.xpath(".//div[@class='meta']/a/text()")[0]
		comment = node.xpath(".//div[@class='meta']/a//text()")[2].strip()
		like = node.xpath(".//div[@class='meta']/span/text()")[0].strip()

		essay = {
			"title" : title,
			"nickname" : nickname,
			"comment" : comment,
			"like" : like
		}

		print("文章資訊:{}".format(essay))

def main():
	html = getHtml(url)
	parse(html)

if __name__ == '__main__':
	main()

複製程式碼

Python3--批量爬取資料之調金山詞霸api進行翻譯

上程式碼:

 #/usr/bin/env python3
#coding=utf8
 
from fake_useragent import UserAgent
import http.client
import hashlib
import urllib
import random,csv
import json,time
import requests
 
#獲取IP列表並檢驗IP的有效性
def get_ip_list():
    f=open('IP.txt','r')
    ip_list=f.readlines()
    f.close()
    return ip_list
 
#從IP列表中獲取隨機IP
def get_random_ip(ip_list):
    proxy_ip = random.choice(ip_list)
    proxy_ip=proxy_ip.strip('\n')
    proxies = {'https': proxy_ip}
    return proxies
 
#註釋:a若查詢不到中人名則返回a(row[6])
def getTransResult(q): 
    type = "json"
    q = q.lower()
    myurl = 'http://dict-co.iciba.com/api/trans/vip/translate'
    #q = 'hello baidu trans'    #要翻譯的內容
    myurl = "http://dict-co.iciba.com/api/dictionary.php?w="+q+"&type="+type+"&key=key"  #開發者Key
 
    ip_list = get_ip_list()
    proxies = get_random_ip(ip_list)
    headers = { 'User-Agent':str(UserAgent().random)}
    try:
        time.sleep(1)
        req=requests.get(myurl,headers=headers,proxies=proxies)
    except:
        print('程式出錯,暫停20秒')
        time.sleep(20)
        proxies = get_random_ip(ip_list)
        headers = { 'User-Agent':str(UserAgent().random)}
        req=requests.get(myurl,headers=headers,proxies=proxies)
    
    req.encoding="utf-8"
    data = req.text
    mresult = json.loads(data)
    getTransResult=''
    try:
    	getTransResult = mresult['symbols'][0]['parts'][0]['means'][0]
    except:
    	return getTransResult
    print('翻譯結果為:'+getTransResult)
    return getTransResult
 
#功能:讀取檔案並處理
def read_file(filepath):
    reader=[]
    with open(filepath,'r') as csvfile:
        spanreader = csv.reader(csvfile,delimiter='|',quoting=csv.QUOTE_MINIMAL)
        for row in spanreader:
            if row:
                reader.append(row)
    return reader
 
#功能:將爬取到的內容寫入檔案
#注意事項:寫檔案時open中要加上newline='',否則寫一行後程式會自動換行
def write_file(filepath,row):
	with open(filepath,'a+',encoding='utf-8',newline='') as csvfile:
		spanreader = csv.writer(csvfile,delimiter='|',quoting=csv.QUOTE_MINIMAL)
		spanreader.writerow(row)
 
if __name__ == "__main__":
    reader = read_file('S_baiduBaike_youdaoChinese_utf-8.csv')
    for row in reader:
        if not row[6]:
            print('現在爬取的人名是:'+row[0])
            TransResult = getTransResult(row[0])
            if not TransResult.find('[人名]')==-1:
                TransResult=TransResult.replace('[人名]','')
                row[6] = TransResult
            elif not TransResult.find('[男子名]')==-1:
                TransResult=TransResult.replace('[男子名]','')
                row[6] = TransResult
            elif not TransResult.find('[女子名]')==-1:
                TransResult=TransResult.replace('[女子名]','')
                row[6] = TransResult
        write_file('經有道金山詞霸爬取後/S_baiduBaike_youdaoChinese_jscb.csv',row)
    print('程式執行結束')
複製程式碼

Python3--批量爬取資料之呼叫百度api進行翻譯

#************************************************************
#檔案功能:利用百度翻譯將英文名翻譯成中文
#************************************************************
 
import csv,requests,random
from fake_useragent import UserAgent
import hashlib 
import json
import time
import urllib.parse
 
class Baidufanyi:
	"""docstring for ClassName"""
	def __init__(self, appid, appSecret, ip_list):
		self.url = 'https://fanyi-api.baidu.com/api/trans/vip/translate'
		self.ip_list = ip_list				#ip列表
		self.appid = appid		#應用ID
		self.appSecret = appSecret		#應用金鑰
		self.langFrom = 'en'		#翻譯前語言
		self.langTo = 'zh'		#翻譯後語言
 
	'''
	功能:將資料url編碼
	註釋:param queryText:待翻譯的文字
	return:返回url編碼過的資料
	'''
	def getUrlEncodeData(self,queryText):
		salt = '2'		#我們將隨機數固定為2
		sign_str = self.appid + queryText + salt + self.appSecret
		sign_str = sign_str.encode('utf-8')
		sign = hashlib.md5(sign_str).hexdigest()
		payload = {
			'q': queryText,
			'from': self.langFrom,
			'to': self.langTo,
			'appid': self.appid,
			'salt': salt,
			'sign': sign
		}  
		# 注意是get請求,不是請求
		data = urllib.parse.urlencode(payload)
		return data
 
	''''' 
	解析頁面,輸出翻譯結果 
	:param html: 翻譯返回的頁面內容 
	:return: None 
	'''  
	def parseHtml(self, html):
		data = json.loads(html)  
		print ('-------------------------')   
		translationResult = data['trans_result'][0]['dst']  
		if isinstance(translationResult, list):  
			translationResult = translationResult[0]  
			print (translationResult)  
		return translationResult
 
	def get_translateResult(self,queryText):
		data = self.getUrlEncodeData(queryText)		#獲取url編碼過的資料
		target_url = self.url + '?' + data 			#構造目標url
		print('target_url為:'+target_url)
		headers = {'User-Agent':'str(UserAgent().random)'}
		try:
			proxies = get_randomIp(self.ip_list)
			req = requests.get(target_url,proxies=proxies,headers=headers,timeout=10)		#構造請求
		except:
			print('執行錯誤,暫停20秒')
			proxies = get_randomIp(self.ip_list)
			req = requests.get(target_url,proxies=proxies,headers=headers)		#再次進行構造請求
		req.encoding='utf-8'
		html = req.text
		translateResult = self.parseHtml(html) 			#解析,顯示翻譯結果
		return translateResult
 
#獲取IP列表並檢驗IP的有效性  
def get_ipList():  
	f=open('IP.txt','r')  
	ip_list=f.readlines()  
	f.close()  
	return ip_list
 
#從IP列表中獲取隨機IP  
def get_randomIp(ip_list):  
	proxy_ip = random.choice(ip_list)  
	proxy_ip=proxy_ip.strip('\n')  
	proxies = {'http': proxy_ip}  
	return proxies
 
#功能:獲取需要翻譯的檔案內容
def reader_file(filePath): 
	reader=[]  
	with open(filePath,'r',encoding='utf-8') as csvfile:  
		spanreader = csv.reader(csvfile,delimiter='|',quoting=csv.QUOTE_MINIMAL)  
		for row in spanreader:  
			if row:  
				reader.append(row)  
	return reader
 
#功能:將資訊寫入檔案
def write_file(filePath,row):  
	with open(filePath,'a+',encoding='utf-8',newline='') as csvfile:  
		spanreader = csv.writer(csvfile,delimiter='|',quoting=csv.QUOTE_MINIMAL)  
		spanreader.writerow(row)
 
#主程式
def main():
	print('程式開始執行!')
	appid = appid	#應用ID
	appSecret = appSecret	#應用金鑰
	filePath = 'baidubaike.csv'		#需要翻譯的檔案
	ip_list = get_ipList()
	fanyi = Baidufanyi(appid,appSecret,ip_list)
	reader = reader_file(filePath)
	for row in reader:
		translateResult = '翻譯成功後的結果'	#翻譯成功後的結果
		if not row[6]:
			print('現在翻譯的英文名是:'+row[0])
			translateResult = fanyi.get_translateResult(row[0])
			print('翻譯成功後的結果是:'+translateResult)
			row[6] = translateResult
			write_file('baidubaike_notChinese.csv',row)			#將爬取過的內容存入test.csv檔案
		else:
			write_file('baidubaike_Chinese.csv',row)			#將未進行爬取的內容存進test_.csv檔案
	print('資訊爬取成功,程式執行結束')
 
if __name__ == '__main__':
	main()
複製程式碼

Python3--批量爬取資料之呼叫有道api進行翻譯

  # coding=utf-8
import urllib,urllib.request
from fake_useragent import UserAgent
import json
import time
import hashlib
import urllib.parse
import requests
import random
import csv,re
 
class YouDaoFanyi:
    def __init__(self, appKey, appSecret):
        self.url = 'https://openapi.youdao.com/api/'
        self.headers = { 'User-Agent':str(UserAgent().random)}
        self.appKey = appKey  # 應用id
        self.appSecret = appSecret  # 應用金鑰
        self.langFrom = 'EN'   # 翻譯前文字語言,auto為自動檢查
        self.langTo = 'zh-CHS'     # 翻譯後文字語言,auto為自動檢查
 
    def getUrlEncodedData(self, queryText):
        '''
        將資料url編碼
        :param queryText: 待翻譯的文字
        :return: 返回url編碼過的資料
        '''
        salt = '2'  # 產生隨機數 ,其實固定值也可以,不如"2"
        sign_str = self.appKey + queryText + salt + self.appSecret
        sign_str=sign_str.encode('utf-8')
        sign = hashlib.md5(sign_str).hexdigest()
        payload = {
            'q': queryText,
            'from': self.langFrom,
            'to': self.langTo,
            'appKey': self.appKey,
            'salt': salt,
            'sign': sign
        }
 
        # 注意是get請求,不是請求
        data = urllib.parse.urlencode(payload)
        return data
 
    def parseHtml(self, html):
        '''
        解析頁面,輸出翻譯結果
        :param html: 翻譯返回的頁面內容
        :return: None
        '''
        data = json.loads(html)
 
        print ('-------------------------') 
        translationResult = data['translation']
        if isinstance(translationResult, list):
            translationResult = translationResult[0]
        print (translationResult)
        return translationResult
 
    def translate(self, queryText):
        data = self.getUrlEncodedData(queryText)  # 獲取url編碼過的資料
        target_url = self.url + '?' + data    # 構造目標url
        # request = urllib2.Request(target_url, headers=self.headers)  # 構造請求
        ip_list=get_ip_list()
        proxies=get_random_ip(ip_list)
        print('隨機ip為:'+str(proxies))
        req = requests.get(target_url,proxies=proxies, headers=self.headers)  # 構造請求
        # with request.urlopen(request) as response111: # 傳送請求
        req.encoding='utf-8'
        html=req.text
        translationResult=self.parseHtml(html)    # 解析,顯示翻譯結果
        return translationResult
 
#功能:讀取檔案並處理
def read_file(filepath):
    reader=[]
    with open(filepath,'r',encoding='utf-8') as csvfile:
        spanreader = csv.reader(csvfile,delimiter='|',quoting=csv.QUOTE_MINIMAL)
        for row in spanreader:
            if row:
                reader.append(row)
    return reader
 
#功能:將爬取到的內容寫入檔案
#注意事項:寫檔案時open中要加上newline='',否則寫一行後程式會自動換行
def write_file(filepath,row):
	with open(filepath,'a+',encoding='utf-8',newline='') as csvfile:
		spanreader = csv.writer(csvfile,delimiter='|',quoting=csv.QUOTE_MINIMAL)
		spanreader.writerow(row)
 
#獲取IP列表並檢驗IP的有效性
def get_ip_list():
    f=open('IP.txt','r')
    ip_list=f.readlines()
    f.close()
    return ip_list
 
#從IP列表中獲取隨機IP
def get_random_ip(ip_list):
    proxy_ip = random.choice(ip_list)
    proxy_ip=proxy_ip.strip('\n')
    proxies = {'http': proxy_ip}
    return proxies
 
if __name__ == "__main__":
    print('程式開始執行!')
    appKey = '應用id'  # 應用id
    appSecret = '應用金鑰'  # 應用金鑰
    fanyi = YouDaoFanyi(appKey, appSecret)
    reader=read_file('E_baiduBaike_notHaveChinese.csv')
    for row in reader:
        print('現在翻譯的人名是:'+row[0])
        translationResult=fanyi.translate(row[0])
        print('翻譯結果為:'+str(translationResult))
        zhPattern = re.compile(u'[\u4e00-\u9fa5]+')
        if zhPattern.search(translationResult):
        	row[6]=translationResult
        write_file('經有道翻譯處理後的檔案/E_baiduBaike_youdaoChinese.csv',row)
    print('爬取完成')
複製程式碼

在這裡插入圖片描述

相關文章