導航:首頁 > 編程語言 > python爬取帖子列表數據

python爬取帖子列表數據

發布時間:2023-01-20 15:44:28

❶ 如何用python爬取數據

方法/步驟

❷ 如何利用python 爬取知乎上面的數據

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author: Administrator
# @Date: 2015-10-31 15:45:27
# @Last Modified by: Administrator
# @Last Modified time: 2015-11-23 16:57:31
import requests
import sys
import json
import re
reload(sys)
sys.setdefaultencoding('utf-8')

#獲取到匹配字元的字元串
def find(pattern,test):
finder = re.search(pattern, test)
start = finder.start()
end = finder.end()
return test[start:end-1]

cookies = {
'_ga':'GA1.2.10sdfsdfsdf', '_za':'8d570b05-b0b1-4c96-a441-faddff34',
'q_c1':'23ddd234234',
'_xsrf':'234id':'"ZTE3NWY2ZTsdfsdfsdfWM2YzYxZmE=|1446435757|"',
'z_c0':'"=|14464e234767|"',
'__utmt':'1', '__utma':'51854390.109883802f8.1417518721.1447917637.144c7922009.4',
'__utmb':'518542340.4.10.1447922009', '__utmc':'51123390', '__utmz':'5185435454sdf06.1.1.utmcsr=hu.com|utmcgcn=(referral)|utmcmd=referral|utmcct=/',
'__utmv':'51854340.1d200-1|2=registration_date=2028=1^3=entry_date=201330318=1'}

headers = {'user-agent':
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36',
'referer':'http://www.hu.com/question/following',
'host':'www.hu.com','Origin':'http://www.hu.com',
'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8',
'Connection':'keep-alive','X-Requested-With':'XMLHttpRequest','Content-Length':'81',
'Accept-Encoding':'gzip,deflate','Accept-Language':'zh-CN,zh;q=0.8','Connection':'keep-alive'
}

#多次訪問之後,其實一載入時載入20個問題,具體參數傳輸就是offset,以20遞增

dicc = {"offset":60}
n=20
b=0

# 與爬取圖片相同的是,往下拉的時候也會發送http請求返回json數據,但是不同的是,像模擬登錄首頁不同的是除了
# 發送form表單的那些東西後,知乎是拒絕了我的請求了,剛開始以為是headers上的攔截,往headers添加瀏覽器
# 訪問是的headers那些信息添加上,發現還是拒絕訪問。

#想了一下,應該是cookie原因。這個載入的請求和模擬登錄首頁不同
#所以補上其他的cookies信息,再次請求,請求成功。
for x in xrange(20,460,20):
n = n+20
b = b+20
dicc['offset'] = x
formdata = {'method':'next','params':'{"offset":20}','_xsrf':''}

#傳輸需要json串,和python的字典是有區別的,需要轉換
formdata['params'] = json.mps(dicc)
# print json.mps(dicc)
# print dicc

circle = requests.post("http://www.hu.com/node/ProfileFollowedQuestionsV2",
cookies=cookies,data=formdata,headers=headers)

#response內容 其實爬過一次之後就大同小異了。 都是
#問題返回的json串格式
# {"r":0,
# "msg": ["<div class=\"zm-profile-section-item zg-clear\">\n
# <span class=\"zm-profile-vote-count\">\n<div class=\"zm-profile-vote-num\">205K<\/div>\n
# <div class=\"zm-profile-vote-type\">\u6d4f\u89c8<\/div>\n
# <\/span>\n<div class=\"zm-profile-section-main\">\n
# <h2 class=\"zm-profile-question\">\n
# <a class=\"question_link\" target=\"_blank\" href=\"\/question\/21719532\">
# \u4ec0\u4e48\u4fc3\u4f7f\u4f60\u8d70\u4e0a\u72ec\u7acb\u5f00\u53d1\u8005\u4e4b\u8def\uff1f<\/a>\n
# <\/h2>\n<div class=\"meta zg-gray\">\n<a data-follow=\"q:link\" class=\"follow-link zg-unfollow meta-item\"
# href=\"javascript:;\" id=\"sfb-868760\">
# <i class=\"z-icon-follow\"><\/i>\u53d6\u6d88\u5173\u6ce8<\/a>\n<span class=\"zg-bull\">•<\/span>\n63 \u4e2a\u56de\u7b54\n<span class=\"zg-bull\">•<\/span>\n3589 \u4eba\u5173\u6ce8\n<\/div>\n<\/div>\n<\/div>",
# "<div class=\"zm-profile-section-item zg-clear\">\n
# <span class=\"zm-profile-vote-count\">\n
# <div class=\"zm-profile-vote-num\">157K<\/div>\n
# <div class=\"zm-profile-vote-type\">\u6d4f\u89c8<\/div>\n
# <\/span>\n<div class=\"zm-profile-section-main\">\n
# <h2 class=\"zm-profile-question\">\n
# <a class=\"question_link\" target=\"_blank\" href=\"\/question\/31764065\">
# \u672c\u79d1\u6e23\u6821\u7684\u5b66\u751f\u5982\u4f55\u8fdb\u5165\u7f8e\u5e1d\u725b\u6821\u8bfbPhD\uff1f<\/a>\n
# <\/h2>\n<div class=\"meta zg-gray\">\n
# <a data-follow=\"q:link\" class=\"follow-link zg-unfollow meta-item\" href=\"javascript:;\" id=\"sfb-4904877\">
# <i class=\"z-icon-follow\"><\/i>\u53d6\u6d88\u5173\u6ce8<\/a>\n<span class=\"zg-bull\">•
# <\/span>\n112 \u4e2a\u56de\u7b54\n<span class=\"zg-bull\">•<\/span>\n1582 \u4eba\u5173\u6ce8\n
# <\/div>\n<\/div>\n<\/div>"]}
# print circle.content

#同樣json串需要自己 轉換成字典後使用
jsondict = json.loads(circle.text)
msgstr = jsondict['msg']
# print len(msgstr)

#根據自己所需要的提取信息規則寫出正則表達式
pattern = 'question\/.*?/a>'
try:
for y in xrange(0,20):
wholequestion = find(pattern, msgstr[y])
pattern2 = '>.*?<'
finalquestion = find(pattern2, wholequestion).replace('>','')
print str(b+y)+" "+finalquestion

#當問題已經訪問完後再傳參數 拋出異常 此時退出循環
except Exception, e:
print "全部%s個問題" %(b+y)
break

❸ 如何使用python爬取知乎數據並做簡單分析

一、使用的技術棧:
爬蟲:python27 +requests+json+bs4+time
分析工具: ELK套件
開發工具:pycharm
數據成果簡單的可視化分析
1.性別分布
0 綠色代表的是男性 ^ . ^
1 代表的是女性
-1 性別不確定
可見知乎的用戶男性頗多。
二、粉絲最多的top30
粉絲最多的前三十名:依次是張佳瑋、李開復、黃繼新等等,去知乎上查這些人,也差不多這個排名,說明爬取的數據具有一定的說服力。
三、寫文章最多的top30
四、爬蟲架構
爬蟲架構圖如下:
說明:
選擇一個活躍的用戶(比如李開復)的url作為入口url.並將已爬取的url存在set中。
抓取內容,並解析該用戶的關注的用戶的列表url,添加這些url到另一個set中,並用已爬取的url作為過濾。
解析該用戶的個人信息,並存取到本地磁碟。
logstash取實時的獲取本地磁碟的用戶數據,並給elsticsearchkibana和elasticsearch配合,將數據轉換成用戶友好的可視化圖形。
五、編碼
爬取一個url:
解析內容:
存本地文件:
代碼說明:
* 需要修改獲取requests請求頭的authorization。
* 需要修改你的文件存儲路徑。
源碼下載:點擊這里,記得star哦!https : // github . com/forezp/ZhihuSpiderMan六、如何獲取authorization
打開chorme,打開https : // www. hu .com/,
登陸,首頁隨便找個用戶,進入他的個人主頁,F12(或滑鼠右鍵,點檢查)七、可改進的地方
可增加線程池,提高爬蟲效率
存儲url的時候我才用的set(),並且採用緩存策略,最多隻存2000個url,防止內存不夠,其實可以存在redis中。
存儲爬取後的用戶我說採取的是本地文件的方式,更好的方式應該是存在mongodb中。
對爬取的用戶應該有一個信息的過濾,比如用戶的粉絲數需要大與100或者參與話題數大於10等才存儲。防止抓取了過多的僵屍用戶。
八、關於ELK套件
關於elk的套件安裝就不討論了,具體見官網就行了。網站:https : // www . elastic . co/另外logstash的配置文件如下:
從爬取的用戶數據可分析的地方很多,比如地域、學歷、年齡等等,我就不一一列舉了。另外,我覺得爬蟲是一件非常有意思的事情,在這個內容消費升級的年代,如何在廣闊的互聯網的數據海洋中挖掘有價值的數據,是一件值得思考和需不斷踐行的事情。

❹ 如何用python爬取汽車之家論壇帖子的內容

你可以通過列表頁抓取內頁的鏈接,然後再通過內頁鏈接獲取內容,分兩步走

❺ python爬取大量數據(百萬級)

當用python爬取大量網頁獲取想要的數據時,最重要的問題是爬蟲中斷問題,python這種腳本語言,一中斷

進程就會退出,怎麼在中斷後繼續上次爬取的任務就至關重要了。這里就重點剖析這個中斷問題。

第一個問題: 簡單點的用動態代理池就能解決,在爬取大量數據的時候,為了速度不受影響,建議使用一些緩

存的中間件將有效的代理 ip 緩存起來,並定時更新。這里推薦 github 這個倉庫

https://github.com/jhao104/proxy_pool , 它會做ip有效性驗證並將 ip 放入 redis ,不過實現過於復雜

了,還用到了 db ,個人覺得最好自己修改一下。困難點的就是它會使用別的請求來進行判斷當前的ip是否

是爬蟲,當我們過於聚焦我們的爬蟲請求而忽略了其他的請求時,可能就會被伺服器判定為爬蟲,進而這個ip

會被列入黑名單,而且你換了ip一樣也會卡死在這里。這種方式呢,簡單點就用 selenium + chrome 一個一個

去爬,不過速度太慢了。還是自己去分析吧,也不會過復雜的。

第二個問題: 網路連接超時是大概率會遇到的問題,有可能是在爬取的時候本地網路波動,也有可能是爬

取的服務端對ip做了限制,在爬取到了一定量級的時候做一些延遲的操作,使得一些通用的 http 庫超時

urllib )。不過如果是服務端動的手腳一般延遲不會太高,我們只需要人為的設置一個高一點的

timeout 即可(30 秒),最好在爬取開始的時候就對我們要用的爬取庫進行一層封裝,通用起來才好改

動。

第三個問題: 在解析大量靜態頁面的時候,有些靜態頁面的解析規則不一樣,所以我們就必須得做好斷點

續爬的准備了( PS : 如果簡單的忽略錯誤可能會導致大量數據的丟失,這就不明智了)。那麼在調試的過

程中斷點續爬有個解決方案,就是生產者和消費者分離,生產者就是產生待爬 url 的爬蟲,消費者就是爬取

最終數據的爬蟲。最終解析數據就是消費者爬蟲了。他們通過消息中間件連接,生產者往消息中間件發送待

爬取的目標信息,消費者從裡面取就行了,還間接的實現了個分布式爬取功能。由於現在的消費中間件都有

ack 機制,一個消費者爬取鏈接失敗會導致消息消費失敗,進而分配給其他消費者消費。所以消息丟失的

概率極低。不過這里還有個 tips , 消費者的消費超時時間不能太長,會導致消息釋放不及時。還有要開啟

消息中間價的數據持久化功能,不然消息產生過多而消費不及時會撐爆機器內存。那樣就得不償失了。

第四個問題: 這種情況只能 try except catch 住了,不好解決,如果單獨分析的話會耗費點時間。但在

大部分數據 (99%) 都正常的情況下就這條不正常拋棄就行了。主要有了第三個問題的解決方案再出現這

種偶爾中斷的問就方便多了。

希望能幫到各位。

❻ 怎麼用python爬取相關數據

以下代碼運行通過:

importrequests
frombs4importBeautifulSoup
importos


headers={
'User-Agent':"Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.1(KHTML,likeGecko)"
"Chrome/22.0.1207.1Safari/537.1"}
##瀏覽器請求頭(大部分網站沒有這個請求頭會報錯)
all_url='http://www.mzitu.com/all'
start_html=requests.get(all_url,headers=headers)
##使用requests中的get方法來獲取all_url的內容headers為請求頭
print(start_html.text)
##列印start_html
##concent是二進制的數據,下載圖片、視頻、音頻、等多媒體內容時使用concent
##列印網頁內容時使用text

運行效果:

❼ 如何用python爬取豆瓣讀書的數據

這兩天爬了豆瓣讀書的十萬條左右的書目信息,用時將近一天,現在趁著這個空閑把代碼總結一下,還是菜鳥,都是用的最簡單最笨的方法,還請路過的大神不吝賜教。
第一步,先看一下我們需要的庫:

import requests #用來請求網頁
from bs4 import BeautifulSoup #解析網頁
import time #設置延時時間,防止爬取過於頻繁被封IP號
import re #正則表達式庫
import pymysql #由於爬取的數據太多,我們要把他存入MySQL資料庫中,這個庫用於連接資料庫
import random #這個庫里用到了產生隨機數的randint函數,和上面的time搭配,使爬取間隔時間隨機

這個是豆瓣的網址:x-sorttags-all
我們要從這里獲取所有分類的標簽鏈接,進一步去爬取裡面的信息,代碼先貼上來:

import requests
from bs4 import BeautifulSoup #導入庫

url="httom/tag/?icn=index-nav"
wb_data=requests.get(url) #請求網址
soup=BeautifulSoup(wb_data.text,"lxml") #解析網頁信息
tags=soup.select("#content > div > div.article > div > div > table > tbody > tr > td > a")
#根據CSS路徑查找標簽信息,CSS路徑獲取方法,右鍵-檢查- selector,tags返回的是一個列表
for tag in tags:
tag=tag.get_text() #將列表中的每一個標簽信息提取出來
helf="hom/tag/"
#觀察一下豆瓣的網址,基本都是這部分加上標簽信息,所以我們要組裝網址,用於爬取標簽詳情頁
url=helf+str(tag)
print(url) #網址組裝完畢,輸出

以上我們便爬取了所有標簽下的網址,我們將這個文件命名為channel,並在channel中創建一個channel字元串,放上我們所有爬取的網址信息,等下爬取詳情頁的時候直接從這里提取鏈接就好了,如下:

channel='''
tag/程序
'''

現在,我們開始第二個程序。


QQ圖片20160915233329.png


標簽頁下每一個圖片的信息基本都是這樣的,我們可以直接從這里提取到標題,作者,出版社,出版時間,價格,評價人數,以及評分等信息(有些外國作品還會有譯者信息),提取方法與提取標簽類似,也是根據CSS路徑提取。
我們先用一個網址來實驗爬取:

url="htt/tag/科技"
wb_data = requests.get(url)
soup = BeautifulSoup(wb_data.text.encode("utf-8"), "lxml")
tag=url.split("?")[0].split("/")[-1] #從鏈接裡面提取標簽信息,方便存儲
detils=soup.select("#subject_list > ul > li > div.info > div.pub") #抓取作者,出版社信息,稍後我們用spite()函數再將他們分離出來
scors=soup.select("#subject_list > ul > li > div.info > div.star.clearfix > span.rating_nums") #抓取評分信息
persons=soup.select("#subject_list > ul > li > div.info > div.star.clearfix > span.pl") #評價人數
titles=soup.select("#subject_list > ul > li > div.info > h2 > a") #書名
#以上抓取的都是我們需要的html語言標簽信息,我們還需要將他們一一分離出來
for detil,scor,person,title in zip(detils,scors,persons,titles):
#用一個zip()函數實現一次遍歷
#因為一些標簽中有譯者信息,一些標簽中沒有,為避免錯誤,所以我們要用一個try來把他們分開執行
try:
author=detil.get_text().split("/",4)[0].split()[0] #這是含有譯者信息的提取辦法,根據「/」 把標簽分為五部分,然後依次提取出來
yizhe= detil.get_text().split("/", 4)[1]
publish=detil.get_text().split("/", 4)[2]
time=detil.get_text().split("/", 4)[3].split()[0].split("-")[0] #時間我們只提取了出版年份
price=ceshi_priceone(detil) #因為價格的單位不統一,我們用一個函數把他們換算為「元」
scoe=scor.get_text() if True else "" #有些書目是沒有評分的,為避免錯誤,我們把沒有評分的信息設置為空
person=ceshi_person(person) #有些書目的評價人數顯示少於十人,爬取過程中會出現錯誤,用一個函數來處理
title=title.get_text().split()[0]
#當沒有譯者信息時,會顯示IndexError,我們分開處理
except IndexError:
try:
author=detil.get_text().split("/", 3)[0].split()[0]
yizhe="" #將detil信息劃分為4部分提取,譯者信息直接設置為空,其他與上面一樣
publish=detil.get_text().split("/", 3)[1]
time=detil.get_text().split("/", 3)[2].split()[0].split("-")[0]
price=ceshi_pricetwo(detil)
scoe=scor.get_text() if True else ""
person=ceshi_person(person)
title=title.get_text().split()[0]
except (IndexError,TypeError):
continue
#出現其他錯誤信息,忽略,繼續執行(有些書目信息下會沒有出版社或者出版年份,但是數量很少,不影響我們大規模爬取,所以直接忽略)
except TypeError:
continue

#提取評價人數的函數,如果評價人數少於十人,按十人處理
def ceshi_person(person):
try:
person = int(person.get_text().split()[0][1:len(person.get_text().split()[0]) - 4])
except ValueError:
person = int(10)
return person

#分情況提取價格的函數,用正則表達式找到含有特殊字元的信息,並換算為「元」
def ceshi_priceone(price):
price = detil.get_text().split("/", 4)[4].split()
if re.match("USD", price[0]):
price = float(price[1]) * 6
elif re.match("CNY", price[0]):
price = price[1]
elif re.match("A$", price[0]):
price = float(price[1:len(price)]) * 6
else:
price = price[0]
return price
def ceshi_pricetwo(price):
price = detil.get_text().split("/", 3)[3].split()
if re.match("USD", price[0]):
price = float(price[1]) * 6
elif re.match("CNY", price[0]):
price = price[1]
elif re.match("A$", price[0]):
price = float(price[1:len(price)]) * 6
else:
price = price[0]
return price

實驗成功後,我們就可以爬取數據並導入到資料庫中了,以下為全部源碼,特殊情況會用注釋一一說明。

import requests
from bs4 import BeautifulSoup
import time
import re
import pymysql
from channel import channel #這是我們第一個程序爬取的鏈接信息
import random

def ceshi_person(person):
try:
person = int(person.get_text().split()[0][1:len(person.get_text().split()[0]) - 4])
except ValueError:
person = int(10)
return person

def ceshi_priceone(price):
price = detil.get_text().split("/", 4)[4].split()
if re.match("USD", price[0]):
price = float(price[1]) * 6
elif re.match("CNY", price[0]):
price = price[1]
elif re.match("A$", price[0]):
price = float(price[1:len(price)]) * 6
else:
price = price[0]
return price

def ceshi_pricetwo(price):
price = detil.get_text().split("/", 3)[3].split()
if re.match("USD", price[0]):
price = float(price[1]) * 6
elif re.match("CNY", price[0]):
price = price[1]
elif re.match("A$", price[0]):
price = float(price[1:len(price)]) * 6
else:
price = price[0]
return price


#這是上面的那個測試函數,我們把它放在主函數中
def mains(url):
wb_data = requests.get(url)
soup = BeautifulSoup(wb_data.text.encode("utf-8"), "lxml")
tag=url.split("?")[0].split("/")[-1]
detils=soup.select("#subject_list > ul > li > div.info > div.pub")
scors=soup.select("#subject_list > ul > li > div.info > div.star.clearfix > span.rating_nums")
persons=soup.select("#subject_list > ul > li > div.info > div.star.clearfix > span.pl")
titles=soup.select("#subject_list > ul > li > div.info > h2 > a")
for detil,scor,person,title in zip(detils,scors,persons,titles):
l = [] #建一個列表,用於存放數據
try:
author=detil.get_text().split("/",4)[0].split()[0]
yizhe= detil.get_text().split("/", 4)[1]
publish=detil.get_text().split("/", 4)[2]
time=detil.get_text().split("/", 4)[3].split()[0].split("-")[0]
price=ceshi_priceone(detil)
scoe=scor.get_text() if True else ""
person=ceshi_person(person)
title=title.get_text().split()[0]
except IndexError:
try:
author=detil.get_text().split("/", 3)[0].split()[0]
yizhe=""
publish=detil.get_text().split("/", 3)[1]
time=detil.get_text().split("/", 3)[2].split()[0].split("-")[0]
price=ceshi_pricetwo(detil)
scoe=scor.get_text() if True else ""
person=ceshi_person(person)
title=title.get_text().split()[0]
except (IndexError,TypeError):
continue

except TypeError:
continue
l.append([title,scoe,author,price,time,publish,person,yizhe,tag])
#將爬取的數據依次填入列表中


sql="INSERT INTO allbooks values(%s,%s,%s,%s,%s,%s,%s,%s,%s)" #這是一條sql插入語句
cur.executemany(sql,l) #執行sql語句,並用executemary()函數批量插入資料庫中
conn.commit()

#主函數到此結束


# 將Python連接到MySQL中的python資料庫中
conn = pymysql.connect( user="root",password="123123",database="python",charset='utf8')
cur = conn.cursor()

cur.execute('DROP TABLE IF EXISTS allbooks') #如果資料庫中有allbooks的資料庫則刪除
sql = """CREATE TABLE allbooks(
title CHAR(255) NOT NULL,
scor CHAR(255),
author CHAR(255),
price CHAR(255),
time CHAR(255),
publish CHAR(255),
person CHAR(255),
yizhe CHAR(255),
tag CHAR(255)
)"""
cur.execute(sql) #執行sql語句,新建一個allbooks的資料庫


start = time.clock() #設置一個時鍾,這樣我們就能知道我們爬取了多長時間了
for urls in channel.split():
urlss=[urls+"?start={}&type=T".format(str(i)) for i in range(0,980,20)] #從channel中提取url信息,並組裝成每一頁的鏈接
for url in urlss:
mains(url) #執行主函數,開始爬取
print(url) #輸出要爬取的鏈接,這樣我們就能知道爬到哪了,發生錯誤也好處理
time.sleep(int(format(random.randint(0,9)))) #設置一個隨機數時間,每爬一個網頁可以隨機的停一段時間,防止IP被封
end = time.clock()
print('Time Usage:', end - start) #爬取結束,輸出爬取時間
count = cur.execute('select * from allbooks')
print('has %s record' % count) #輸出爬取的總數目條數

# 釋放數據連接
if cur:
cur.close()
if conn:
conn.close()

這樣,一個程序就算完成了,豆瓣的書目信息就一條條地寫進了我們的資料庫中,當然,在爬取的過程中,也遇到了很多問題,比如標題返回的信息拆分後中會有空格,寫入資料庫中會出現錯誤,所以只截取了標題的第一部分,因而導致資料庫中的一些書名不完整,過往的大神如果有什麼辦法,還請指教一二。
等待爬取的過程是漫長而又欣喜的,看著電腦上一條條信息被刷出來,成就感就不知不覺湧上心頭;然而如果你吃飯時它在爬,你上廁所時它在爬,你都已經爬了個山回來了它還在爬時,便會有點崩潰了,擔心電腦隨時都會壞掉(還是窮學生換不起啊啊啊啊~)
所以,還是要好好學學設置斷點,多線程,以及正則,路漫漫其修遠兮,吾將上下而求索~共勉~

❽ 怎麼使用python來爬取網頁上的表格信息

稍微說一下背景,當時我想研究蛋白質與小分子的復合物在空間三維結構上的一些規律,首先得有數據啊,數據從哪裡來?就是從一個涵蓋所有已經解析三維結構的蛋白質-小分子復合物的資料庫裡面下載。這時候,手動一個個去下顯然是不可取的,我們需要寫個腳本,能從特定的網站選擇性得批量下載需要的信息。python是不錯的選擇。

import urllib #python中用於獲取網站的模塊
import urllib2, cookielib

有些網站訪問時需要cookie的,python處理cookie代碼如下:
cj = cookielib.CookieJar ( )
opener = urllib2.build_opener( urllib2.HttpCookieProcessor(cj) )
urllib2.install_opener (opener)

通常我們需要在網站中搜索得到我們需要的信息,這里分為二種情況:

1. 第一種,直接改變網址就可以得到你想要搜索的頁面:

def GetWebPage( x ): #我們定義一個獲取頁面的函數,x 是用於呈遞你在頁面中搜索的內容的參數
url = 'http://xxxxx/xxx.cgi?&' + 『你想要搜索的參數』 # 結合自己頁面情況適當修改
page = urllib2.urlopen(url)
pageContent = page.read( )
return pageContent #返回的是HTML格式的頁面信息

2.第二種,你需要用到post方法,將你搜索的內容放在postdata裡面,然後返回你需要的頁面

def GetWebPage( x ): #我們定義一個獲取頁面的函數,x 是用於呈遞你在頁面中搜索的內容的參數
url = 'http://xxxxx/xxx' #這個網址是你進入搜索界面的網址
postData = urllib.urlencode( { 各種『post』參數輸入 } ) #這裡面的post參數輸入需要自己去查
req= urllib2.Request (url, postData)
pageContent = urllib2.urlopen (req). read( )
return pageContent #返回的是HTML格式的頁面信息

在獲取了我們需要的網頁信息之後,我們需要從獲得的網頁中進一步獲取我們需要的信息,這里我推薦使用 BeautifulSoup 這個模塊, python自帶的沒有,可以自行網路谷歌下載安裝。 BeautifulSoup 翻譯就是『美味的湯』,你需要做的是從一鍋湯裡面找到你喜歡吃的東西。

import re # 正則表達式,用於匹配字元
from bs4 import BeautifulSoup # 導入BeautifulSoup 模塊

soup = BeautifulSoup(pageContent) #pageContent就是上面我們搜索得到的頁面

soup就是 HTML 中所有的標簽(tag)BeautifulSoup處理格式化後的字元串,一個標準的tag形式為:

hwkobe24

通過一些過濾方法,我們可以從soup中獲取我們需要的信息:

(1) find_all ( name , attrs , recursive , text , **kwargs)
這裡面,我們通過添加對標簽的約束來獲取需要的標簽列表, 比如 soup.find_all ('p') 就是尋找名字為『p』的 標簽,而soup.find_all (class = "tittle") 就是找到所有class屬性為"tittle" 的標簽,以及soup.find_all ( class = re.compile('lass')) 表示 class屬性中包含『lass』的所有標簽,這里用到了正則表達式(可以自己學習一下,非常有用滴)

當我們獲取了所有想要標簽的列表之後,遍歷這個列表,再獲取標簽中你需要的內容,通常我們需要標簽中的文字部分,也就是網頁中顯示出來的文字,代碼如下:

tagList = soup.find_all (class="tittle") #如果標簽比較復雜,可以用多個過濾條件使過濾更加嚴格

for tag in tagList:
print tag.text
f.write ( str(tag.text) ) #將這些信息寫入本地文件中以後使用

(2)find( name , attrs , recursive , text , **kwargs )

它與 find_all( ) 方法唯一的區別是 find_all() 方法的返回結果是值包含一個元素的列表,而 find() 方法直接返回結果

(3)find_parents( ) find_parent( )

find_all() 和 find() 只搜索當前節點的所有子節點,孫子節點等. find_parents() 和 find_parent() 用來搜索當前節點的父輩節點,搜索方法與普通tag的搜索方法相同,搜索文檔搜索文檔包含的內容

(4)find_next_siblings() find_next_sibling()

這2個方法通過 .next_siblings 屬性對當 tag 的所有後面解析的兄弟 tag 節點進代, find_next_siblings() 方法返回所有符合條件的後面的兄弟節點,find_next_sibling() 只返回符合條件的後面的第一個tag節點

(5)find_previous_siblings() find_previous_sibling()

這2個方法通過 .previous_siblings 屬性對當前 tag 的前面解析的兄弟 tag 節點進行迭代, find_previous_siblings()方法返回所有符合條件的前面的兄弟節點, find_previous_sibling() 方法返回第一個符合條件的前面的兄弟節點

(6)find_all_next() find_next()

這2個方法通過 .next_elements 屬性對當前 tag 的之後的 tag 和字元串進行迭代, find_all_next() 方法返回所有符合條件的節點, find_next() 方法返回第一個符合條件的節點

(7)find_all_previous() 和 find_previous()

這2個方法通過 .previous_elements 屬性對當前節點前面的 tag 和字元串進行迭代, find_all_previous() 方法返回所有符合條件的節點, find_previous()方法返回第一個符合條件的節點

具體的使用方法還有很多,用到這里你應該可以解決大部分問題了,如果要更深入了解可以參考官方的使用說明哈!

❾ python怎麼爬取數據

根據你要抓取頁面的源碼欄位來進行爬取。根據對應的源碼找到你的需求數據,主要用到requests+BeautifulSoup,其中requests用於請求頁面,BeautifulSoup用於解析頁面。

閱讀全文

與python爬取帖子列表數據相關的資料

熱點內容
單片機的原理概述 瀏覽:506
火控pdf 瀏覽:267
如何復制雲伺服器centos環境 瀏覽:984
債權pdf 瀏覽:299
紅色番字的app怎麼下載 瀏覽:876
雲伺服器流程教課 瀏覽:702
中國農業銀行app怎麼沒有網 瀏覽:997
幾率表演算法 瀏覽:902
程序員理工科 瀏覽:708
企業郵箱登錄收件伺服器地址 瀏覽:558
計算機思維與演算法設計的重要性 瀏覽:664
linux刷新磁碟命令 瀏覽:76
我的世界如何查看伺服器種子pc 瀏覽:284
linuxlamp編譯安裝 瀏覽:609
枚舉演算法ppt 瀏覽:184
cmd查看進程命令 瀏覽:956
手機內怎麼刪除APP 瀏覽:834
魚群和鳥群演算法區別 瀏覽:93
pdf尺寸設置 瀏覽:211
android訪問本地伺服器 瀏覽:512