python爬蟲(一)爬取糗事百科

2021-08-06 03:32:33 字數 2791 閱讀 2949

最近需要收集語料,因此學習了一些爬蟲的知識,參考網上對糗事百科的爬蟲,編寫了如下**

#!usr/bin/env python

# -*- coding: utf-8 -*-

import re

from urllib import request

for page in range(1, 2):

print(page)

url = '' + str(page)

user_agent = 'mozilla/4.0 (compatible; msie 5.5; windows nt)'

headers =

try:

req = request.request(url, headers=headers)

with request.urlopen(req, timeout=5) as response:

content = response.read().decode('utf-8')

print(content)

pattern = re.compile(

'.*?(.*?).*?.*?(.*?)'\

'.*?(.*?)',

re.s)

items = re.findall(pattern, content)

for item in items:

if not re.search("thumb", item[3]):

print(item[0].replace("'", ""), item[1].strip(), item[2].strip(), item[4], item[5])

except request.urlerror as e:

if hasattr(e, "code"):

print(e.code)

if hasattr(e, "reason"):

print(e.reason)

對下面正規表示式的解釋(引用

pattern = re.compile(

'.*?(.*?).*?.*?(.*?)'\

'.*?(.*?)',

re.s)

1).*? 是乙個固定的搭配,.和*代表可以匹配任意無限多個字元,加上?表示使用非貪婪模式進行匹配,也就是我們會盡可能短地做匹配,以後我們還會大量用到 .*? 的搭配。

2)(.*?)代表乙個分組,在這個正規表示式中我們匹配了五個分組,在後面的遍歷item中,item[0]就代表第乙個(.*?)所指代的內容,item[1]就代表第二個(.*?)所指代的內容,以此類推。

3)re.s 標誌代表在匹配時為點任意匹配模式,點 . 也可以代表換行符。

以上**在執行的過程中可能會存在問題(爬著爬著,就跑不動了),查詢了一些資料後,給的原因是對於太過複雜的正規表示式,匹配時會出現這樣的情況。

鑑於以上這種原因,我們採用beautifulsoup可以解決,beautifulsoup是根據html的格式來解析的。具體**如下

#!usr/bin/env python

# -*- coding: utf-8 -*-

import re

from urllib import request

from bs4 import beautifulsoup

def find_all(item, attr, c):

return item.find_all(attr, attrs=, limit=1)

for page in range(1, 20):

print(page)

url = '' + str(page)

user_agent = 'mozilla/4.0 (compatible; msie 5.5; windows nt)'

headers =

try:

req = request.request(url, headers=headers)

with request.urlopen(req, timeout=5) as response:

content = response.read().decode('utf-8')

soup = beautifulsoup(content, 'html.parser')

all_div = soup.find_all('div', attrs=)

for i, e_div in enumerate(all_div):

result = {}

result['id'] = e_div.attrs['id']

result['name'] = e_div.h2.string.strip()

cont = e_div.find_all('div', attrs=)

result['content'] = cont[0].text.strip()

silme_comment = e_div.find_all('i', attrs=)

result['silme_num'] = int(silme_comment[0].text.strip())

result['comment_num'] = int(silme_comment[1].text.strip())

print(result)

except request.urlerror as e:

if hasattr(e, "code"):

print(e.code)

if hasattr(e, "reason"):

print(e.reason)

python 爬取糗事百科

step 1 構建乙個提取糗事百科笑話的函式import urllib2 import urllib import re import thread import time import sys reload sys sys.setdefaultencoding utf 8 defgetpage p...

Python爬取糗事百科

一 引入模組 因為urlopen功能比較簡單,所以設定 ip需引入proxyhandler和build opener模組,ip的獲取可以上西祠 查詢 import re from urllib.request import request,build opener,proxyhandler base...

Python 爬取糗事百科

coding utf 8 import urllib2 import urllib import re class qiushi def init self self.page 1 從網頁獲取糗事 def getqiushis self,page url page 偽裝瀏覽器 user agent ...