zoukankan      html  css  js  c++  java
  • python-requests 简单实现数据抓取

    安装包:
      requests,lxml
    request包用于进行数据抓取,
    lxml用来进行数据解析
    对于对网页内容的处理,由于html本身并非如数据库一样为结构化的查询所见即所得,所以需要对网页的内容进行分析然后进行内容提取,lxml就是用来完成此项工作
    在requests中最用的方法为get()方法,通常情况下可以将url做为参数传入进去,对于一些功能比较完善的网站如果存在反爬取数据的功能是则需要设置headers参数内容,内容为一字典类型
    可以在浏览器中查看User-Agent字段的内容,设置后requests将在抓取数据时同时提交所设置的头信息以进行浏览器的访问模拟
    同时在抓取数据时要注意网站所使用的字符编码,当编码不一至时需要对字符编码进行相应的转换
    具体见以下代码注释
    #!/usr/bin/python
    # encoding: utf-8
    import requests
    from lxml import etree


    url='http://www.chinanews.com/scroll-news/mil/2017/0110/news.shtml'

    def getNewUrlList():
    global url
    header ={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36'}    构造浏览器头信息
    response=requests.get(url,headers=header)   获取数据
    html=response.content.decode("gbk")    解码
    selector=etree.HTML(html)
    contents = selector.xpath('//div[@id="content_right"]/div[@class="content_list"]/ul/li[div]')    使用xpath语法解析获取数据//表示从根开始查找@后跟相应的html属性
    for eachlink in contents:
    url = eachlink.xpath('div/a/@href')[0] if str(eachlink.xpath('div/a/@href')[0]).__contains__("http") else "http://www.chinanews.com"+eachlink.xpath('div/a/@href')[0]
    title = eachlink.xpath('div/a/text()')[0]
    ptime = eachlink.xpath('div[@class="dd_time"]/text()')[0]
    yield (title,url,ptime)

    def getNewContent(urlList):
    for title,url,ptime in urlList:
    response=requests.get(url,headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36'})
    html=response.content.decode("gbk")
    selector=etree.HTML(html)
    title=selector.xpath("//div[@id='cont_1_1_2']/h1/text()")[0]
    source=selector.xpath("//div[@id='cont_1_1_2']/div[@class='left-time']/div[@class='left-t']/text()")[0]
    content=selector.xpath("//div[@id='cont_1_1_2']/div[@class='left_zw']/p/text()")

    i=0
    resultContent=''
    for item in range(0,content.__len__()):
    resultContent+=content[i]
    i+=1
    yield (title,source,resultContent)

    if __name__=="__main__":
    urlList= getNewUrlList()
    result= getNewContent(urlList)
    for title,source,content in result:
    print u"标题:%s"%title
    print u"来源:%s"%source
    print u"正文:%s"%content



  • 相关阅读:
    android中自定义Theme以及TitleBar
    PaddlePaddle(飞浆)图像分割7日打卡营心得
    tensorflow中models的安装
    多个重要的多项式算法以及源码
    dll中全局变量在外部进行引用
    旋转、平移、缩放矩阵
    windows编译caffe2遇到的问题
    关于opencv中cv::Mat设置roi
    Recall(召回率);Precision(准确率);F1-Meature(综合评价指标);true positives;false positives;false negatives..
    ubuntu16.04 无法wifi链接一段时间掉线且无法再连接
  • 原文地址:https://www.cnblogs.com/lijintian/p/6279122.html
Copyright © 2011-2022 走看看