Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
moyewuji
Python-100-Days
提交
b8725569
P
Python-100-Days
项目概览
moyewuji
/
Python-100-Days
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
Python-100-Days
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
b8725569
编写于
5月 29, 2018
作者:
骆昊的技术专栏
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
更新了爬虫第3天的代码
上级
8adc0315
变更
4
显示空白变更内容
内联
并排
Showing
4 changed file
with
109 addition
and
2 deletion
+109
-2
Day66-75/02.数据采集和解析.md
Day66-75/02.数据采集和解析.md
+1
-1
Day66-75/03.存储数据.md
Day66-75/03.存储数据.md
+58
-0
Day66-75/code/example05.py
Day66-75/code/example05.py
+1
-1
Day66-75/code/example06.py
Day66-75/code/example06.py
+49
-0
未找到文件。
Day66-75/02.数据采集和解析.md
浏览文件 @
b8725569
...
...
@@ -87,7 +87,7 @@
> 说明:更多内容可以参考BeautifulSoup的[官方文档]()。
###
例子
- 获取知乎发现上的问题链接
###
实例
- 获取知乎发现上的问题链接
```
Python
from urllib.parse import urljoin
...
...
Day66-75/03.存储数据.md
浏览文件 @
b8725569
...
...
@@ -197,5 +197,63 @@ b'admin'
### 实例 - 缓存知乎发现上的链接和页面代码
```
Python
from hashlib import sha1
from urllib.parse import urljoin
import pickle
import re
import requests
import zlib
from bs4 import BeautifulSoup
from redis import Redis
def main():
# 指定种子页面
base_url = 'https://www.zhihu.com/'
seed_url = urljoin(base_url, 'explore')
# 创建Redis客户端
client = Redis(host='1.2.3.4', port=6379, password='1qaz2wsx')
# 设置用户代理(否则访问会被拒绝)
headers = {'user-agent': 'Baiduspider'}
# 通过requests模块发送GET请求并指定用户代理
resp = requests.get(seed_url, headers=headers)
# 创建BeautifulSoup对象并指定使用lxml作为解析器
soup = BeautifulSoup(resp.text, 'lxml')
href_regex = re.compile(r'^/question')
# 查找所有href属性以/question打头的a标签
for a_tag in soup.find_all('a', {'href': href_regex}):
# 获取a标签的href属性值并组装完整的URL
href = a_tag.attrs['href']
full_url = urljoin(base_url, href)
# 将URL处理成SHA1摘要(长度固定更简短)
hasher = sha1()
hasher.update(full_url.encode('utf-8'))
field_key = hasher.hexdigest()
# 如果Redis的键'zhihu'对应的hash数据类型中没有URL的摘要就访问页面并缓存
if not client.hexists('zhihu', field_key):
html_page = requests.get(full_url, headers=headers).text
# 对页面进行序列化和压缩操作
zipped_page = zlib.compress(pickle.dumps(html_page))
# 使用hash数据类型保存URL摘要及其对应的页面代码
client.hset('zhihu', field_key, zipped_page)
# 显示总共缓存了多少个页面
print('Total %d question pages found.' % client.hlen('zhihu'))
if __name__ == '__main__':
main()
```
Day66-75/code/example05.py
浏览文件 @
b8725569
...
...
@@ -50,7 +50,7 @@ def get_matched_parts(page_html, pattern_str, pattern_ignore_case=re.I):
# 开始执行爬虫程序
def
start_crawl
(
seed_url
,
match_pattern
,
*
,
max_depth
=-
1
):
client
=
redis
.
Redis
(
host
=
'1
20.77.222.217'
,
port
=
11223
,
password
=
'1qaz2wsx'
)
client
=
redis
.
Redis
(
host
=
'1
.2.3.4'
,
port
=
6379
,
password
=
'1qaz2wsx'
)
charsets
=
(
'utf-8'
,
'gbk'
,
'gb2312'
)
logging
.
info
(
'[Redis ping]'
,
client
.
ping
())
url_list
=
[
seed_url
]
...
...
Day66-75/code/example06.py
0 → 100644
浏览文件 @
b8725569
from
hashlib
import
sha1
from
urllib.parse
import
urljoin
import
pickle
import
re
import
requests
import
zlib
from
bs4
import
BeautifulSoup
from
redis
import
Redis
def
main
():
# 指定种子页面
base_url
=
'https://www.zhihu.com/'
seed_url
=
urljoin
(
base_url
,
'explore'
)
# 创建Redis客户端
client
=
Redis
(
host
=
'1.2.3.4'
,
port
=
6379
,
password
=
'1qaz2wsx'
)
# 设置用户代理
headers
=
{
'user-agent'
:
'Baiduspider'
}
# 通过requests模块发送GET请求并指定用户代理
resp
=
requests
.
get
(
seed_url
,
headers
=
headers
)
# 创建BeautifulSoup对象并指定使用lxml作为解析器
soup
=
BeautifulSoup
(
resp
.
text
,
'lxml'
)
href_regex
=
re
.
compile
(
r
'^/question'
)
# 查找所有href属性以/question打头的a标签
for
a_tag
in
soup
.
find_all
(
'a'
,
{
'href'
:
href_regex
}):
# 获取a标签的href属性值并组装完整的URL
href
=
a_tag
.
attrs
[
'href'
]
full_url
=
urljoin
(
base_url
,
href
)
# 将URL处理成SHA1摘要(长度固定更简短)
hasher
=
sha1
()
hasher
.
update
(
full_url
.
encode
(
'utf-8'
))
field_key
=
hasher
.
hexdigest
()
# 如果Redis的键'zhihu'对应的hash数据类型中没有URL的摘要就访问页面并缓存
if
not
client
.
hexists
(
'zhihu'
,
field_key
):
html_page
=
requests
.
get
(
full_url
,
headers
=
headers
).
text
# 对页面进行序列化和压缩操作
zipped_page
=
zlib
.
compress
(
pickle
.
dumps
(
html_page
))
# 使用hash数据类型保存URL摘要及其对应的页面代码
client
.
hset
(
'zhihu'
,
field_key
,
zipped_page
)
# 显示总共缓存了多少个页面
print
(
'Total %d question pages found.'
%
client
.
hlen
(
'zhihu'
))
if
__name__
==
'__main__'
:
main
()
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录