• python之爬取网页数据总结(一)


    今天尝试使用python,爬取网页数据。因为python是新安装好的,所以要正常运行爬取数据的代码需要提前安装插件。分别为requests    Beautifulsoup4   lxml  三个插件。

    因为配置了环境变量,可以cmd命令直接安装。假如电脑上有两个版本的python,建议进入到目录安装。

    安装的命令为 pip install requests(Beautifulsoup4   /lxml  ) 三条分别执行。

    安装结束,可以尝试网上一些简单的例子,明白了解 Beautifulsoup4   解析网页所使用的方式。这个可以避开正则表达式,个人感觉学起来很方便。

    soup.select('') 这个方法就是解析网页代码,提取其中某一部分。该方法的使用可以类比java 爬虫的webmagic  jsoupXpath-0.1.1.jar 的使用方法。

    主要理解这个方法之后就可以看懂大部分代码。

    以下为网上的例子代码,比较简单,适合学习。

    import requests
    from bs4 import BeautifulSoup
    def getHTMLText(url):
        try:
            r = requests.get(url, timeout = 30)
            r.raise_for_status()
            #r.encoding = 'utf-8'
            return r.text
        except:
            return ""
    def getContent(url):
        html = getHTMLText(url)
        # print(html)
        soup = BeautifulSoup(html, "html.parser")
        title = soup.select("div.hd > h1")
        print(title[0].get_text())
        time = soup.select("div.a_Info > span.a_time")
        print(time[0].string)
        author = soup.select("div.qq_articleFt > div.qq_toolWrap > div.qq_editor")
        print(author[0].get_text())
        paras = soup.select("div.Cnt-Main-Article-QQ > p.text")
        for para in paras:
            if len(para) > 0:
                print(para.get_text())
                print()
        #写入文件
        fo = open("text.txt", "w+")
        fo.writelines(title[0].get_text() + "
    ")
        fo.writelines(time[0].get_text() + "
    ")
        for para in paras:
            if len(para) > 0:
                fo.writelines(para.get_text() + "
    
    ")
        fo.writelines(author[0].get_text() + '
    ')
        fo.close()
        #将爬取到的文章用字典格式来存
        article = {
            'Title' : title[0].get_text(),
            'Time' : time[0].get_text(),
            'Paragraph' : paras,
            'Author' : author[0].get_text()
        }
        print(article)
    def main():
        url = "http://news.qq.com/a/20170504/012032.htm"
        getContent(url);
    main()
    

      掌握基本的爬取数据之后,便尝爬取取大量数据。经过多次尝试发现,首先需要准备多个ip,同一个ip多次访问长时间会导致结果全部为空。

    其次是多线程,为的是增加速度。python中多线程网上大多使用的是pool

    使用

    if __name__ == '__main__':#需加上这句代码,这时是一种固定的写法
    # pool()有一个参数,processes,表示有多少个进程,比如processes=2
    pool = ThreadPool() //网上大部分使用的是pool=Pool(),但是经过多次尝试总是失败,然后改成了这样的。

    pool.map(get_all_list_info,urlStr) //两个参数,第一个为调用的方法,该方法有参数,但是后边不写形参,map的第二个参数为一个迭代器,就是集合形式,会按顺序取其中的数据,作为参数传递给方法。
    pool.close()
    pool.join()

    掌握这些,基本可以实现大量数据爬取。

  • 相关阅读:
    方法的参数传递机制
    策略模式
    Factory(简单的工厂模式)
    java 跨域问题解决
    Map 转成Json字符串
    FastDFS 上传,删除文件
    MD5 密码加盐
    Java-图片压缩
    调用支付宝人脸采集查询图片Base64解码
    HttpClient工具类
  • 原文地址:https://www.cnblogs.com/wys-373/p/10356964.html
Copyright © 2020-2023  润新知