在上一篇的时候,我们完成了华盛顿邮报页面的爬取,但是显然那只是一个跑通全流程的任务框架,离真正的应用还有一些距离。比如说在搜索的关键词比较火爆时,搜索结果中会出现Load more results,这意味着我们之前爬取的数据并不完全。我将在这篇博客中解决这个bug。
在这里插入图片描述
  对于我们这种基础的爬虫来说,观察是非常重要的,大多数问题都可以通过观察解决。根据我们上一篇的经验,我们知道这个网站的获取新闻的参数传递主要是靠From Data完成的,那这个Load more data前的新闻数据也应该是根据这个传入的参数获取的,这就意味着只要我们修改了合适的参数,就可以显示我们想要的新闻数量了。
  查看Preview可以发现,对于32篇新闻,这个华盛顿邮报的搜索结果里只显示10篇的结果,这显然是不合适的,那要怎么改?
在这里插入图片描述
  查看From Data,我们很快就能发现有蹊跷的地方。
在这里插入图片描述
  那么对于这个问题,我们就有两种思路解决了。

  • hitsPerPage改的特别特别大,这样就能完全显示所有的信息了。
  • 不改变hitsPerPage,模仿浏览器点击加载更多。用循环不断获取新的page,最后完成遍历。
      我们采取第一个方法,因为这个方法可以避免多次访问,受网络速度影响不大,更加稳定。此外,直接改变这个参数,可以避免给代码增加一个循环,影响既有的代码架构。
      找到这俩关键的参数:
    在这里插入图片描述
      接下来就是对之前任务的微调。
# 获取数据
def getdata(keyword, url_set):
    headers = {
        'Accept': '*/*',
        'Accept-Encoding': 'gzip, deflate, br',
        # 字典形式,根据自己的电脑看着写
    }
    url = r'https://o19n5yy9r3-3.algolianet.com/1/indexes/*/queries?x-algolia-agent=Algolia%20for%20JavaScript%20(4.13.1)%3B%20Browser%3B%20JS%20Helper%20(3.9.0)%3B%20react%20(17.0.2)%3B%20react-instantsearch%20(6.29.0)'
    data = {"requests":[{"indexName":"crawler_wapocrawl_sortby_publish_date","params":"analytics=true&clickAnalytics=true&distinct=true&facetFilters=%5B%5B%5D%2C%5B%5D%5D&facets=%5B%5D&filters=publish_date_timestamp%3A1483200000000%20TO%201660532252000&highlightPostTag=%3C%2Fais-highlight-0000000000%3E&highlightPreTag=%3Cais-highlight-0000000000%3E&hitsPerPage=10&page=0&query"+ keyword +"&tagFilters="}]}
    # 获取nbHits
    num_news = json.loads(requests.post(url, headers=headers, data=json.dumps(data)).text)["results"][0]["nbHits"]
    # 修正过的data
    data = {"requests":[{"indexName":"crawler_wapocrawl_sortby_publish_date","params":"analytics=true&clickAnalytics=true&distinct=true&facetFilters=%5B%5B%5D%2C%5B%5D%5D&facets=%5B%5D&filters=publish_date_timestamp%3A1483200000000%20TO%201660532252000&highlightPostTag=%3C%2Fais-highlight-0000000000%3E&highlightPreTag=%3Cais-highlight-0000000000%3E&hitsPerPage="+ str(num_news) +"&page=0&query"+ keyword +"&tagFilters="}]}
    req = json.loads(requests.post(url, headers=headers, data=json.dumps(data)).text)
    return data_process(req, url_set, keyword)
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐