pool.map()爬取美文网标题内容

'''
日期: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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值