你好,我是悅創。
部落格文章:www.aiyc.top/archives/24…
實戰專案一:爬取西刺代理(獲取代理IP)
爬蟲的學習就是與反扒措施、反扒系統做鬥爭的一個過程,而使用代理 IP 是我們重要的防反扒的重要措施,代理 IP 的來源有兩種。 一是:你花錢去購買商家會給你提供一個介面你直接呼叫就可以了,二是:自己在網上爬取高效IP。在這篇部落格中我重點給大家講一下如何從網上獲取高效IP,我們下面的IP來源於西刺代理,這是我很久之前寫的一篇部落格,今天來進行“翻新”一番希望可以幫助到大家。
1. 安裝必要的第三方庫
BeautifulSoup
和 requests,BeautifulSoup
負責解析 HTML 網頁原始碼,requests
負責傳送請求來獲取網頁原始碼,BeautifulSoup
和 requests
均屬於 Python 爬蟲的基礎庫,可以通過pip安裝。開啟命令列輸入命令 pip install BeautifulSoup4
和 pip install requests
進行安裝:
pip list
在 pip 安裝包列表中檢查 BeautifulSoup
和 requests
庫是否安裝成功。
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 自動點贊分以下幾個步驟:
- 登入賬號
- 獲取並儲存 cookies
- 讀取並傳入 cookies
- 實現自動點贊
二、程式碼實現
(一)匯入第三方庫
對於 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/')
複製程式碼
程式碼功能:
- 開啟谷歌瀏覽器,
- 自動輸入百度網址並開啟百度
如果程式執行錯誤,瀏覽器沒有開啟,那麼應該是沒有裝 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-Agent
與 IP
。User-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('爬取完成')
複製程式碼