【百度爬虫系列 II】关键字搜索url结果汇总(给定关键字和页数)

源码和结果:https://github.com/luyishisi/Anti-Anti-Spider/tree/master/11.%E7%99%BE%E5%BA%A6%E7%88%AC%E8%99%AB%E7%B3%BB%E5%88%97

相关文章

【百度系列 I】多关键字图片搜索结果汇总
【百度系列 II】关键字搜索url结果汇总(给定关键字和页数)
【百度系列 III】深度搜索(给定网址采集全部url)

目的

为批量获取百度搜索结果,实现一个自动采集工具,将指定关键词和页数返回搜索结果的url保存在指定文件中。

要求

  1. 给定关键字wd, 页数pn, 存储文件路径save_file_name值。
  2. 将搜索结果网页页面1到pn上所有网址url采集下来,保存在指定文件中。
    【百度爬虫系列 II】关键字搜索url结果汇总(给定关键字和页数)_第1张图片

思路

  1. 通过填充请求头将wd和pn补充完整。
  2. 通过requests请求获取网页文本,将网页文本用lxml解析成标准的html标签格式。
  3. 根据属性href筛选标签获取当前网页的url。
  4. 将获取的url保存在集合中,最后保存在指定文件中。
    其中你会遇到一个问题,会发现网页源码的url和点击进去的url不一致。
    【百度爬虫系列 II】关键字搜索url结果汇总(给定关键字和页数)_第2张图片
    怎么解决url不一致的问题?
    采取的办法是:获取的url通过redirect跳转,就可获取真实的url。

代码

#-*-coding:utf-8 -*-
#网页url采集爬虫,给定网址,以及存储文件,将该网页内全部网址采集下,可指定文件存储方式
#os    : ubuntu16.04
#python: python2
import requests,time
from lxml import etree
"""
修改主函数的搜索关键字:

"""
def Redirect(url):
    try:
        res = requests.get(url,timeout=10)
        url = res.url
    except Exception as e:
        print("4",e)
        time.sleep(1)
    return url

def baidu_search(wd,pn_max,save_file_name):

    #百度搜索爬虫,给定关键词和页数以及存储到哪个文件中,返回结果去重复后的url集合
    url = "https://www.baidu.com/s"
    return_set = set()
    for page in range(pn_max):
        pn = page*10
        querystring = {"wd":wd,"pn":pn}
        headers = {
            'pragma': "no-cache",
            'accept-encoding': "gzip, deflate, br",
            'accept-language': "zh-CN,zh;q=0.8",
            'upgrade-insecure-requests': "1",
            'user-agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36",
            'accept': "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
            'cache-control': "no-cache",
            'connection': "keep-alive",
            }
        try:
            response = requests.request("GET", url, headers=headers, params=querystring)
            print("!!!!!!!!!!!!",response.url)
            #解析html
            selector = etree.HTML(response.text, parser=etree.HTMLParser(encoding='utf-8'))
        except Exception as e:
            print ("页面加载失败", e)
            continue
        with open(save_file_name,"a") as f:
            for i in range(1,10):
                try:
                    #根据属性href筛选标签
                    context = selector.xpath('//*[@id="'+str(pn+i)+'"]/h3/a[1]/@href')
                    print(len(context),context[0])
                    #跳转到获取的url,若可跳转则返回url
                    i = Redirect(context[0])
                    print "context="+context[0]
                    print "i="+i
                    break
                    f.write(i)
                    return_set.add(i)
                    f.write("\n")
                except Exception as e:
                    print(i,return_set)
                    print("3",e)
    return return_set

if __name__ == '__main__':
    wd = "阿里巴巴 双十一"
    pn = 3
    save_file_name = "save_url.txt"
    return_set = baidu_search(wd,pn,save_file_name)


源码和结果:https://github.com/xuna123/Web-crawer

你可能感兴趣的:(【爬虫实践】)