Python爬蟲(chóng)爬取指定信息
和我的上一篇文章相同,記錄自己學(xué)習(xí)過(guò)程以及經(jīng)驗(yàn)感受分享哪自。
上一篇文章內(nèi)容是爬取指定圖片丰包,那么這一片文章就是爬取自己想要的文字部分信息。這個(gè)有什么用呢壤巷?在之后可以將爬取好的信息(數(shù)據(jù)量龐大的)進(jìn)行清洗整理后邑彪,在Hadoop上進(jìn)行數(shù)據(jù)分析,最后再可視化胧华。
接下來(lái)也是分享幾個(gè)網(wǎng)站寄症,用實(shí)際應(yīng)用來(lái)說(shuō)明解決問(wèn)題宙彪。
網(wǎng)站1: 京東女鞋
需要用到的庫(kù)和上一篇文章差不多還是requests和BeautifulSoup。
前五個(gè)步驟和我上一篇文章是一樣的有巧,因此可以參考一下我的上一篇文章Python爬蟲(chóng)爬取圖片释漆。所以這里就不過(guò)多的去解釋了。
直接上前幾個(gè)步驟的代碼:
import requests
from bs4 import BeautifulSoup
heads = {
? ? "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
}
def downJDLadyShoe():
? ? for i in range(1, 200):
? ? ? ? strUrl = "https://list.jd.com/list.html?cat=11729%2C11731%2C9772&pag=" + str(i) + "&s=121&click=0"
? ? ? ? print(strUrl)
? ? ? ? downWebContent(strUrl)
def downWebContent(url):
? ? ? ? ? ? r = requests.get(url, headers=heads)
? ? ? ? ? ? print(r.status_code)
? ? ? ? ? ? parserWebContent(r.text)
def parserWebContent(content):
? ? bs = BeautifulSoup(content, "html.parser")
? ? tags = bs.find_all("li", class_="gl-item")
? ? for tag in tags:
? ? ? ? #print(tag)
? ? ? ? parseProductTag(tag)
接下來(lái)就是找到對(duì)應(yīng)的商品信息將其爬取出來(lái)篮迎。
這里我們用到了contents,意思就是該標(biāo)簽下的全部?jī)?nèi)容男图,然后借助index來(lái)輔助我們?nèi)ゲ檎椅覀兿胍膬?nèi)容。contents[參數(shù)]甜橱,參數(shù)的位置就是我們想要的爬取的對(duì)應(yīng)的信息逊笆。在之后的replace("\n", “”)是因?yàn)檫@些信息有很多都是存在自動(dòng)換行的,直接爬取下來(lái)會(huì)導(dǎo)致寫(xiě)入時(shí)查看不方便等岂傲。因此就將換行給代替掉难裆。我們這里找了四個(gè)指標(biāo):name1是店名,name2是商品名字以及商品價(jià)格和商品圖片譬胎。這里還用到了getText()函數(shù)差牛,意思就是將該標(biāo)簽里的字符串提取出來(lái)。圖片的網(wǎng)頁(yè)鏈接缺失了頭部堰乔,因此手動(dòng)給它加上去偏化。
最后我們?cè)賹⑦@些全部拼接起來(lái),寫(xiě)入到txt里就完成了镐侯。這里是寫(xiě)到同級(jí)目錄的侦讨,若是想寫(xiě)到其它位置,將其改一下就好了苟翻。不用提前去創(chuàng)建好txt韵卤,PyCharm看你沒(méi)有的話,它會(huì)自動(dòng)給你創(chuàng)建的崇猫。
def parseProductTag(productTag):
? ? index = 0
? ? for subTag in productTag.div.contents:
? ? ? ? index = index + 1
? ? ? ? name1 = productTag.div.contents[13].getText().replace("\n", "")
? ? ? ? name2 = productTag.div.contents[7].a.em.getText().replace("\n", "")
? ? ? ? price = productTag.div.contents[5].getText().replace("\n", "")
? ? ? ? img = "https:" + productTag.div.contents[1].a.img["data-lazy-img"].replace("\n", "")
? ? f = open("京東女鞋商品信息.txt", mode="a+", encoding="utf-8")
? ? f.write(name1 + ";" + name2 + ";" + price + ";" + img + "\n")
? ? f.close()
完整的代碼是這樣的:
import requests
from bs4 import BeautifulSoup
heads = {
? ? "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
}
def downJDLadyShoe():
? ? for i in range(1, 200):
? ? ? ? strUrl = "https://list.jd.com/list.html?cat=11729%2C11731%2C9772&pag=" + str(i) + "&s=121&click=0"
? ? ? ? print(strUrl)
? ? ? ? downWebContent(strUrl)
def downWebContent(url):
? ? r = requests.get(url, headers=heads)
? ? print(r.status_code)
? ? parserWebContent(r.text)
def parserWebContent(content):
? ? bs = BeautifulSoup(content, "html.parser")
? ? tags = bs.find_all("li", class_="gl-item")
? ? for tag in tags:
? ? ? ? print(tag)
? ? ? ? parseProductTag(tag)
def parseProductTag(productTag):
? ? index = 0
? ? for subTag in productTag.div.contents:
? ? ? ? index = index + 1
? ? ? ? name1 = productTag.div.contents[13].getText().replace("\n", "")
? ? ? ? name2 = productTag.div.contents[7].a.em.getText().replace("\n", "")
? ? ? ? price = productTag.div.contents[5].getText().replace("\n", "")
? ? ? ? img = "https:" + productTag.div.contents[1].a.img["data-lazy-img"].replace("\n", "")
? ? f = open("京東女鞋商品信息.txt", mode="a+", encoding="utf-8")
? ? f.write(name1 + ";" + name2 + ";" + price + ";" + img + "\n")
? ? f.close()
if __name__ == "__main__":
? ? downJDLadyShoe()
最后爬取結(jié)果是這樣的:
網(wǎng)站2:拉鉤網(wǎng)
內(nèi)容操作流程都是一樣的沈条,但是不一樣的就是,這個(gè)網(wǎng)站我們需要的信息都在contents[1]里面可以找到诅炉,這樣就省了我們好多事了蜡歹。
于是我們的代碼就很快可以完成啦!
完整的代碼是這樣的:
import requests
from bs4 import BeautifulSoup
heads = {
? ? "user-agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
}
def parseProductTag(productTag):
? ? index = 0
? ? for subTag in productTag.div.contents:
? ? ? ? #print(index)
? ? ? ? #print(subTag)
? ? ? ? index = index + 1
? ? information = productTag.div.contents[1].getText().replace("\n", "")#.split(" ")[0]
? ? #information1 = information[-7:]
? ? #print(information)
? ? f = open("招聘信息.txt", mode="a+", encoding="utf-8")
? ? f.write(information + "\n")
? ? f.close()
? ? print("完成")
def parseWebContent(content):
? ? soup = BeautifulSoup(content, "html.parser")
? ? tags = soup.find_all("li", class_="con_list_item default_list")
? ? for tag in tags:
? ? ? ? #print(len(tag))
? ? ? ? parseProductTag(tag)
def downWebContent(url):
? ? r = requests.get(url, headers=heads)
? ? print(r.status_code)
? ? r.encoding = r.apparent_encoding
? ? #print(r.text)
? ? parseWebContent(r.text)
def downzhaopin():
? ? for i in range(1,5):
? ? ? ? if i == 1:
? ? ? ? ? ? strUrl = "http://72.itmc.org.cn/JS001/open/show/zhaopin/index.html"
? ? ? ? if i != 1:
? ? ? ? ? ? strUrl="http://72.itmc.org.cn/JS001/open/show/zhaopin/index_" + str(i) + ".html"
? ? ? ? #print(strUrl)
? ? ? ? downWebContent(strUrl)
if __name__ == "__main__":
? ? downzhaopin()
如果想跟上一個(gè)網(wǎng)站一樣挨個(gè)找然后再拼接起來(lái)的話當(dāng)然也是可以的涕烧,這里用了string和getText()月而。這二者的區(qū)別在于當(dāng)該標(biāo)簽里還嵌有其它標(biāo)簽的時(shí)候就只能用getText(),而用string則會(huì)報(bào)錯(cuò)议纯。當(dāng)該標(biāo)簽里沒(méi)有其它標(biāo)簽時(shí)既可以用getText()也可以用string父款,因此我個(gè)人覺(jué)得getText()比string要好些。
那么代碼應(yīng)該就是這樣的:
tags1 = soup.find_all("h3", style="max-width:180px")
a = str(tag1.string)
? ? tags2 = soup.find_all("span", class_="add")
b = str(tag2.getText())
tags3 = soup.find_all("span", class_="money")
c = str(tag3.string)
? ? f = open("招聘信息.txt", mode="a+", encoding="utf-8")
? ? f.write(a + ";" + b + ";" + c + "\n")
? ? f.close()
? ? print("完成")
最后爬取的結(jié)果是這樣的:
網(wǎng)站3: 當(dāng)當(dāng)網(wǎng)
這個(gè)網(wǎng)站基本流程也是和第一個(gè)也是差不多的,區(qū)別就是在最后一個(gè)函數(shù)加了一個(gè)if判斷語(yǔ)句而已憨攒。前面的都理解到了的話世杀,那么這個(gè)自然也是不在話下了,嘿嘿肝集。
直接上完整的代碼吧:
import requests
from bs4 import BeautifulSoup
head = {
? ? "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
}
def downDangdangbook():
? ? for i in range(1, 101):
? ? ? ? strurl = "http://category.dangdang.com/pg" + str(i) + "-cp01.49.01.00.00.00.html"
? ? ? ? print(strurl)
? ? ? ? downWebContent(strurl)
def downWebContent(url):
? ? r = requests.get(url, headers=head)
? ? print(r.status_code)
? ? r.encoding=r.apparent_encoding
? ? parseWebcontent(r.text)
def parseWebcontent(content):
? ? bs = BeautifulSoup(content, "html.parser")
? ? ulTag = bs.find("ul", class_="bigimg")
? ? print(ulTag)
? ? index = 0
? ? for liTag in ulTag.contents:
? ? ? ? index = index + 1
? ? ? ? if index % 2 == 1:
? ? ? ? ? ? continue
? ? ? ? ? ? print(index)
? ? ? ? parserProductTag(liTag)
def parserProductTag(productTag):
? ? imgurl = productTag.a.img["src"]
? ? if not imgurl.startswith("http"):
? ? ? ? imgurl = productTag.a.img["data-original"]
? ? name = productTag.contents[2].getText()
? ? price = productTag.contents[4].contents[3].getText()
? ? f = open("教輔書(shū)籍信息.txt", mode="a+", encoding="utf-8")
? ? f.write(name + ";" + price + ";" + imgurl + "\n")
? ? f.close()
if __name__ == "__main__":
? ? downDangdangbook()
最后的爬取結(jié)果是這樣的:
很明顯玫坛,爬取自己想要的信息所用到的方法肯定不止我文中的這些。所以希望可以多多交流包晰。嘿嘿!
文中有解釋不到位或者錯(cuò)誤的地方炕吸,歡迎各位大佬們的指正哦伐憾。
這次的分享就到此為止了,之后我還會(huì)繼續(xù)分享自己的學(xué)習(xí)經(jīng)歷赫模,讓自己不斷成長(zhǎng)树肃!
沖呀?jīng)_呀?jīng)_呀!F俾蕖胸嘴!