'''
日期:2020年12月24日
需求:
- 标题,里面内容
- 用线程池爬取
总结:
- etree时当前目录‘.’,不能忘掉
- join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。
- pool.map()的用法:
- 有两个参数可以传,第一个参数传的是函数,第二个参数传的是数据列表。
可以定义多个方法利用return传递。
'''
import requests
from lxml import etree
from fake_useragent import UserAgent
from multiprocessing.dummy import Pool
ger_url = 'http://www.szwj72.cn/'
headers = {
"User-Agent": UserAgent().random
}
re_text = requests.get(ger_url, headers=headers)
re_text.encoding = 'gbk'
tree = etree.HTML(re_text.text)
lists = tree.xpath('//div[@class="ui attached segment"]/div/div[@class="eleven wide column"]/h3/a')
# 点击每一个标题进入内容页
content_urls = []
for l in lists:
# 注意在当前目录
title = l.xpath('./text()')[0]
content_url_temp = l.xpath('./@href')[0]
dict = {
'title': title,
'content_url': content_url_temp
}
content_urls.append(dict)
# 定义方法,
def get_content(dict):
print('开始下载')
url = dict['content_url']
content = requests.get(url=url, headers=headers)
content.encoding = 'gbk'
tree = etree.HTML(content.text)
content = tree.xpath('//article[@class="article-content"]/p//text()')
# join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。
content = ''.join(content)
return save_content(content)
def save_content(content):
with open(f'{dict["title"]}' + '.txt', 'w', encoding='gbk') as f:
t = content.replace('\xa0', '')
f.write(t)
print('下载完成')
# 方法一:
# 创建4个线程池,或者更多
# pool = Pool(4)
# # pool.map()函数,这个函数,有两个参数可以传,第一个参数传的是函数,第二个参数传的是数据列表
# pool.map(get_content,content_urls)
# pool.close()
# 方法2:
# 可以用with 不需要再关闭
with Pool(4) as p:
res = p.map(get_content, content_urls)
pool.map()爬取美文网标题内容
最新推荐文章于 2023-10-31 16:33:08 发布