python爬取百度搜索结果ur汇总

写了两篇之后,我觉得关于爬虫,重点还是分析过程

分析些什么呢:

1)首先明确自己要爬取的目标

  比如这次我们需要爬取的是使用百度搜索之后所有出来的url结果

2)分析手动进行的获取目标的过程,以便以程序实现

  比如百度,我们先进行输入关键词搜索,然后百度反馈给我们搜索结果页,我们再一个个进行点击查询

3)思考程序如何实现,并克服实现中的具体困难

那么我们就先按上面的步骤来,我们首先认识到所搜引擎,提供一个搜索框,让用户进行输入,然后点击执行

我们可以先模拟进行搜索,发现点击搜索之后的完整url中有一项很关键,如下

http://www.baidu.com/s?wd=搜索内容......

后面的内容我们尝试去除之后再次请求上面的url,发现返回的信息一样,我们就可以断定请求的url只需要填入wd这个参数即可

接着我们就应该进行尝试requests.get()查看是否能正常返回页面,防止百度的反爬虫

嘿,幸运的是返回页面正常哈哈~

(当然如果没有返回到正常信息,只要设置好headers或者严格的cookies就行了)

import requests

url = ‘http://www.baidu.com/s?wd=......‘

r = requests.get(url)

print r.status_code,r.content

好,接下来我们就想知道怎么爬取所有的结果

我么再次对url进行分析,发现url中还有一项很关键,是控制页码的项:

http://www.baidu.com/s?wd=...&pn=x

这个x是每10为一页,第一页为0,而且一共76页,也就是750最大值,大于750则返回第一页

接下来我们就可以对抓取到的页面进行分析

还是使用友好的beautifulsoup

我们通过分析发现我们所需要的url在标签a中的href里,而且格式是这样:

http://www.baidu.com/link?url=......

因为还存在很多别的url混淆,所以我们只需要进行一个筛选就行了

而且这个获得的url并不是我们想要的url结果,这只是百度的一个跳转链接

但是让我欣慰的是,当我们队这个跳转链接进行get请求后,直接返回get对象的url便是我们想要的结果链接了

然后我们再次进行尝试,发现还是没有别的反爬虫机制哈哈

本来的想法是,我们是否要先进行一个对新的url返回的状态码进行一个筛选,不是200就不行(甚至还需要些headers)

但是我发现,其实就算不是200,我们只要返回请求对象的url就行了,和能不能正常返回没关系

因为我们的目的并不是请求的页面结果,而是请求的url

所以只需要全部打印出来就行了

当然我建议写一个简单的笼统的headers写入get,这样至少能排除一些不必要的结果

接着我们请求的完整思路就差不多了

上代码:

#coding=utf-8

import requests
import sys
import Queue
import threading
from bs4 import BeautifulSoup as bs
import re

headers = {
    ......
}

class baiduSpider(threading.Thread):
    def __init__(self,queue,name):
        threading.Thread.__init__(self)
        self._queue = queue
        self._name = name

    def run(self):
        while not self._queue.empty():
            url = self._queue.get()
            try:
                self.get_url(url)
            except Exception,e:
                print e
                pass
                #一定要异常处理!!!不然中途会停下,爬取的内容就不完整了!!!

    def get_url(self,url):
        r = requests.get(url = url,headers = headers)
        soup = bs(r.content,"html.parser")
        urls = soup.find_all(name=‘a‘,attrs={‘href‘:re.compile((‘.‘))})
#        for i in urls:
#            print i

        #抓取百度搜索结果中的a标签,其中href是包含了百度的跳转地址

        for i in urls:
            if ‘www.baidu.com/link?url=‘ in i[‘href‘]:
                a = requests.get(url = i[‘href‘],headers = headers)

                #对跳转地址进行一次访问,返回访问的url就能得到我们需要抓取的url结果了

                #if a.status_code == 200:
                #print a.url

                with open(‘E:/url/‘+self._name+‘.txt‘) as f:
                    if a.url not in f.read():
                        f = open(‘E:/url/‘+self._name+‘.txt‘,‘a‘)
                        f.write(a.url+‘\n‘)
                        f.close()

def main(keyword):

    name = keyword

    f = open(‘E:/url/‘+name+‘.txt‘,‘w‘)
    f.close()

    queue = Queue.Queue()
    for i in range(0,760,10):
        queue.put(‘http://www.baidu.com/s?wd=%s&pn=%s‘%(keyword,str(i)))

    threads = []
    thread_count = 10

    for i in range(thread_count):
        spider = baiduSpider(queue,name)
        threads.append(spider)

    for i in threads:
        i.start()

    for i in threads:
        i.join()

    print "It‘s down,sir!"

if __name__ == ‘__main__‘:

    if len(sys.argv) != 2:
        print ‘no keyword‘
        print ‘Please enter keyword ‘

        sys.exit(-1)
    else:
        main(sys.argv[1])

我们工具的功能就是:

python 123.py keyword

就能将url结果写入文件

这边sys我有话讲

在if __name__ == ‘__main__‘:中先进行一个判断,如果输入的字段是一个,那么我们就返回提醒信息,让用户进行键入

如果是两个,那么就将第二个键入记为keyword进行操作

当然这边逻辑有个缺陷,就是大于两个字符会不会有别的问题(别的问题哦!!!)

值得研究一下,但这不是我们这篇的重点

好啦,今天的百度url结果手收集就那么多啦!

谢谢观看哦!

时间: 2024-12-26 18:52:28

python爬取百度搜索结果ur汇总的相关文章

python爬取百度搜索图片

在之前通过爬取贴吧图片有了一点经验,先根据之前经验再次爬取百度搜索界面图片 废话不说,先上代码 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2017/7/22 10:44 # @Author : wqj # @Contact : [email protected] # @Site : # @File : test.py # @Software: PyCharm Community Edition import requests

python爬取百度翻译返回:{'error': 997, 'from': 'zh', 'to': 'en', 'query 问题

解决办法: 修改url为手机版的地址:http://fanyi.baidu.com/basetrans User-Agent也用手机版的 测试代码: # -*- coding: utf-8 -*- """ ------------------------------------------------- File Name: requestsGet Description : 爬取在线翻译数据s Author : 神秘藏宝室 date: 2018-04-17 --------

python 爬取百度url

1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @Date : 2017-08-29 18:38:23 4 # @Author : EnderZhou ([email protected]) 5 # @Link : http://www.cnblogs.com/enderzhou/ 6 # @Version : $Id$ 7 8 import requests 9 import sys 10 from Queue import Queu

Python爬取百度贴吧内容

参考资料:https://cuiqingcai.com/993.html  即 静觅» Python爬虫实战二之爬取百度贴吧帖子 我最近在忙学校的一个小项目的时候涉及到NLP的内容.但是在考虑如何训练的时候却才懂什么叫巧妇难为无米之炊的滋味.中文语料库实在少的可怜,偶尔有一两个带标签的语料库,拿出一看,标注惨不忍睹,都让我怀疑是不是机器标注的.正应了那句话,人工智能,有多少智能就有多少人工. 有什么办法呢,硬着头皮,走一步是一步吧,总比停滞不前要好.项目涉及到帖子,那么我相信不管是谁,首先想到的

使用python抓取百度搜索、百度新闻搜索的关键词个数

由于实验的要求,需要统计一系列的字符串通过百度搜索得到的关键词个数,于是使用python写了一个相关的脚本. 在写这个脚本的过程中遇到了很多的问题,下面会一一道来. ps:我并没有系统地学习过python,只是很久之前用过它,感觉用起来还比较方便,于是这回又把它拾起来使用了.当然这也是考虑到手上有python机器学习的实战书籍,所以估计一段时间后还会再用的缘故. 思路:首先使用python的库函数把网页的内容爬下来,然后使用正则表达式去匹配想要的字符串,最后进行字符串处理就能得到想要的东西了.

python--输入检索词自动爬取百度搜索页标题信息

背景:在百度每次输入关键词检索后,会出现很多的检索页,不利于有效阅读,为更方便收集检索信息,编写了一个可以收集每个检索页与检索词相关的十条检索信息(百度在每个检索页放置十条检索标题信息).可以根据需要选择爬取多少检索页,通过修改main()函数的depth变量 1 import urllib.request 2 import re 3 4 def get_html_text(url,data_lst,depth): 5 7 for i in range(depth): 8 9 # 根据分析构造网

Python爬取百度实时热点排行榜

今天爬取的百度的实时热点排行榜 按照惯例,先下载网站的内容到本地: 1 def downhtml(): 2 url = 'http://top.baidu.com/buzz?b=1&fr=20811' 3 headers = {'User-Agent':'Mozilla/5.0'} 4 r = requests.get('url',headers=headers) 5 with open('C:/Code/info_baidu.html','wb') as f: 6 f.write(r.cont

python 爬取百度云资源

1 import urllib.request 2 import re 3 import random 4 5 def get_source(key): 6 7 print('请稍等,爬取中....') 8 headers = [{'User-Agent':'Mozilla/5.0 (Windows NT 6.3 WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.8.1000 Chrome/30.0.1599.101 Safari

【学习笔记】python爬取百度真实url

今天跑个脚本需要一堆测试的url,,,挨个找复制粘贴肯定不是程序员的风格,so,还是写个脚本吧. 环境:python2.7 编辑器:sublime text 3 一.分析一下 首先非常感谢百度大佬的url分类非常整齐,都在一个类下 即c-showurl,所以只要根据css爬取链接就可以,利用beautifulsoup即可实现,代码如下:         soup = BeautifulSoup(content,'html.parser')         urls = soup.find_all