爬虫基础系列urllib实战——贴吧爬虫(9)

1920664-0c61644217f76c3a.jpg
  • 我们想爬取一个网页,重要的是前期的分析工作。
  • 爬虫的方式是比较灵活的,很多情况是通过分析网址的规律,假设url的网址,然后达到爬取的目的。

整体目标

  • 百度贴吧python吧网址的内容分页爬取:
    第一页内容http://tieba.baidu.com/f?ie=utf-8&kw=Python&fr=search&red_tag=u2330968650
    第二页内容http://tieba.baidu.com/f?kw=python&ie=utf-8&pn=50 (2-1)50
    第三页内容http://tieba.baidu.com/f?kw=python&ie=utf-8&pn=100 (3-1)
    50
    第四页内容http://tieba.baidu.com/f?kw=python&ie=utf-8&pn=150 (4-1)*50
  • 通过分析猜测第一页的内容http://tieba.baidu.com/f?kw=python&ie=utf-8&pn=0 (1-1)50
    那么通过构造get请求的方式获取分页的url地址,pn的规律为(n-1)
    50

构思爬取步骤

  1. 可能用到的库:urllib、urllib.request、time
  2. 定义3个函数,一个下载网页,一个爬取数据,一个保存数据。
    整体代码:
import urllib
from urllib import request
import time
header={"User-Agent":"Mozilla/5.0 (Windows NT 5.1; rv:52.0) Gecko/20100101 Firefox/52.0"}
# for i in range(1,4):
#     print("http://tieba.baidu.com/f?kw=python&ie=utf-8&pn="+str((i-1)*50))



def loadpage(fullurl,filename):
    print("正在下载:",filename)
    req=request.Request(fullurl,headers=header)
    resp=request.urlopen(req).read()#html页面为2进制文件不需要解码
    return resp

def writepage(html,filename):
    print("正在保存",filename)
    with open(filename,"wb") as f:
        f.write(html)
    print("-------------------------------")

def tiebaspider(url,begin,end):
    for page in range(begin,end+1):
        pn=(page-1)*50
        fullurl=url+"&pn="+str(pn)#每次请求的url
        print(fullurl)
        filename="f:/第"+str(page)+"页.html"#每次请求保存的文件名
        html=loadpage(fullurl,filename)#调用爬虫爬取页面
        writepage(html,filename)

if __name__=='__main__':
    kw=input("请输入要爬取得贴吧名")
    begin=int(input("请输入起始页"))
    end=int(input("请输入结束页"))
    url="http://tieba.baidu.com/f?"
    key=urllib.parse.urlencode({"kw":kw})#当输入中文时编码
    ulr=url+key
    tiebaspider(url,begin,end)
    time.sleep(10)

最后略微提一下异常处理

  • 当网址不符合规范或者爬不到的情况下,Python会报错,那么在代码中提前将错误的情况给排除,增加爬虫的成功率。
  • 通过try---except---提前将错误抛出。
from urllib import request
url1="http://www.baidu.com/"
url2="http://www.baidu.com/"
url3="http://www.fjlagjgljdkdkdkd.com/"
url4="http://www.baidu.com/"
url5="http://www.baidu.com/"

urllist=[url1,url2,url3,url4,url5]
for url in urllist:
    print(url)
    try:
        request.urlopen(url).read()
    except Exception:
        print("这是个错误的网站")

你可能感兴趣的:(爬虫基础系列urllib实战——贴吧爬虫(9))