物种日历——果壳网

前言

  果壳网,作为一个开放、多元的泛科技兴趣社区,吸引了百万名有意思、爱知识、乐于分享的年轻人聚集在这里,用知识创造价值,为生活添加智趣。在这里可以关注感兴趣的人,阅读他们的推荐,也将有意思的内容分享给关注的人;依兴趣关注不同的小组,精准阅读喜欢的内容,并与网友交流;在“果壳问答”里提出困惑你的科技问题,或提供靠谱的答案。这是在百度百科上复制的。个人觉得果壳网上的文章还是不错的,比一些自媒体上的标题党强多了。

  本文就是一个爬虫的案例,用来练手,以显得我在忙。

运行环境

  windows 10;

  pycharm;

第三方库

import requests
from lxml import etree
import re
from fake_useragent import UserAgent
import queue
import csv
import time,threading

案例分析

  这个案例的主要难点在于数据清洗。毕竟果壳网上的文章不是纯文本,但是我们想获得得就是纯文本文章。其次就是需要解决网站对标签的编码(个人不认为这算的上是反爬),但是果壳网会封ip的。我在本案例中没有对齐进行处理。

对于这一种现象,我采用的就是直接对照,然后进行替换。

代码实现

import requests
from lxml import etree
import re
from fake_useragent import UserAgent
import queue
import csv
import time,threading
ua=UserAgent()
url_Queue=queue.Queue(1000)
Q_num=queue.Queue(1000)
for i in range(390):Q_num.put(i)

#获取每一个文章页面的url
def get_url():
    while Q_num:
        url='https://www.guokr.com/apis/minisite/article.json?retrieve_type=by_wx&channel_key=pac&offset={}&limit=10'.format(Q_num.get()*10)
        try:
            txt=requests.get(url,headers={"User-Agent":ua.random}).text
            time.sleep(3)
        except:
            print('文章页面抓取完毕')
            break
        article_urls=re.findall('http://www.guokr.com/article/\d+/',txt)
        for article_url in article_urls:
            print(article_url)
            url_Queue.put(article_url)
#获取每一个文章页面的详细内容
def get_data():
    while url_Queue:
        url=url_Queue.get()
        try:
            time.sleep(3)
            txt = requests.get(url, headers={"User-Agent": ua.random}).text.replace(r'\u003E', '>').replace(r'\u003C','<').replace(r'\u002F', r'/').replace(r'\"', '"') \
                .replace('\n', '').replace('\t', '').replace('\r', '')
            txt = re.sub('图片:.+?</p>', '</p>', txt)
            html = etree.HTML(txt)
            title = html.xpath('//h2/text()')[0].strip().replace('\n', '')
            print(title)
            author = html.xpath('//*[@id="app"]/section[2]/div/div[2]/div/div[2]/section/span/text()')[0]
            w_type = html.xpath('//span[@id="copyright_logo"]/text()')[0]
            contents = html.xpath('//section//text()')
            f_writer.writerow([title,author,w_type,''.join(contents[52:-60]).strip()])
        except Exception as e:
            time.sleep(5)
            pass

if __name__ == '__main__':
    f=open('guokes.csv','w+',encoding='utf-8',newline='')
    f_writer=csv.writer(f)
    f_writer.writerow(['title','author','w_type','content'])
    for i in range(10):
        ta=threading.Thread(target=get_url)
        ta.start()
    for j in range(5):
        t1=threading.Thread(target=get_data)
        t1.start()

效果截图

  

反思总结

  1. 代码不够简洁,有一些用于的代码。

     2. 没有解决ip被封的问题。

  3. 技术在不停的进步,这些基础的技术也会被替代,最近发现了一个比requests更好的第三方库。这个库就是requests-html。

  4. 终身学习,不能停下学习的脚步。

  5.缓进则退,不进则亡。

猜你喜欢

转载自www.cnblogs.com/cwily/p/12696840.html