今天跑个脚本需要一堆测试的url,,,挨个找复制粘贴肯定不是程序员的风格,so,还是写个脚本吧。

        环境:python2.7

        编辑器:sublime text 3

       一、分析一下

        首先非常感谢百度大佬的url分类非常整齐,都在一个类下

       

wKioL1myOoKwHUt_AABV9rZbvps718.png-wh_50

        即c-showurl,所以只要根据css爬取链接就可以,利用beautifulsoup即可实现,代码如下:

        

        soup = BeautifulSoup(content,'html.parser')
        urls = soup.find_all("a",class_='c-showurl')

        还有另外的一个问题是百度对url进行了加密,要想获得真实的url,我的思路是访问一遍加密的url,再获得访问界面的url,这时获取到的url即为真实的url。

完整代码如下:

#coding = utf-8
import requests
from bs4 import BeautifulSoup
import time
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

headers = {
                    'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
                    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36 QIHU 360SE'
            }

page_start = raw_input('please input stratpage\n')
page_end = raw_input('please input endpage\n')
word = raw_input('please input keyword\n')

if page_start == 1:
    page_start = 0
else:
    page_start = (int(page_start)-1)*10

page_end = (int(page_end)-1)*10

for i in range(page_start,page_end,10):
    url = 'http://www.baidu.com/s?wd='+word+'&pn='+str(i)
    try:
        response = requests.get(url,headers=headers,timeout=10,verify=False)
        print 'downloading...'+url
        content = response.content
        soup = BeautifulSoup(content,'html.parser')
        urls = soup.find_all("a",class_='c-showurl')
        for href in urls:
            a = href['href']
            try:
                res = requests.get(a,headers=headers,timeout=10,verify=False)
                with open('urls.txt','a') as f:
                    f.write(res.url)
                    f.write('\n')
                time.sleep(1)
            except Exception,e:
                print e
                pass
        print 'finished!'
    except Exception,e:
        print e
        pass

当然,这只是简单的功能,如果爬取大量的url,建议利用线程进行处理,不然等到爬完也等到地老天荒了。。。。。我是爬取百十来个url,亲测还可以。

(修改了一下,添加了verify=False,这样就不会出现ssl的错误)