zoukankan      html  css  js  c++  java
  • 完善爬取糗百的段子

    # -*- coding: utf-8 -*-   
    
    import requests
    from bs4 import BeautifulSoup
    import os
    import codecs
    import MySQLdb
    import re
    import random
    import time
    
    class download():
     
        def __init__(self):
     
            self.iplist = []  ##初始化一个list用来存放我们获取到的IP
            html = requests.get("http://haoip.cc/tiqu.htm")  ##不解释咯
            iplistn = re.findall(r'r/>(.*?)<b', html.text, re.S)  ##表示从html.text中获取所有r/><b中的内容,re.S的意思是包括匹配包括换行符,findall返回的是个list哦!
            for ip in iplistn:
                i = re.sub('
    ', '', ip)  ##re.sub 是re模块替换的方法,这儿表示将
    替换为空
                self.iplist.append(i.strip())  ##添加到我们上面初始化的list里面
     
            self.user_agent_list = [
                "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
                "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
                "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
                "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
                "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
                "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",
                "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
                "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
                "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
                "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
                "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
                "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
                "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
                "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
                "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
                "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
                "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
                "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
            ]
     
        def get(self, url, timeout, proxy=None, num_retries=6): ##给函数一个默认参数proxy为空
            UA = random.choice(self.user_agent_list) ##从self.user_agent_list中随机取出一个字符串
            headers = {'User-Agent': UA}  ##构造成一个完整的User-Agent (UA代表的是上面随机取出来的字符串哦)
     
            if proxy == None: ##当代理为空时,不使用代理获取response(别忘了response啥哦!之前说过了!!)
                try:
                    return requests.get(url, headers=headers, timeout=timeout)##这样服务器就会以为我们是真的浏览器了
                except:##如过上面的代码执行报错则执行下面的代码
     
                    if num_retries > 0: ##num_retries是我们限定的重试次数
                        time.sleep(10) ##延迟十秒
                        print(u'获取网页出错,10S后将获取倒数第:', num_retries, u'')
                        return self.get(url, timeout, num_retries-1)  ##调用自身 并将次数减1
                    else:
                        print(u'开始使用代理')
                        time.sleep(10)
                        IP = ''.join(str(random.choice(self.iplist)).strip()) ##下面有解释哦
                        proxy = {'http': IP}
                        return self.get(url, timeout, proxy,) ##代理不为空的时候
     
            else: ##当代理不为空
                try:
                    IP = ''.join(str(random.choice(self.iplist)).strip()) ##将从self.iplist中获取的字符串处理成我们需要的格式(处理了些什么自己看哦,这是基础呢)
                    proxy = {'http': IP} ##构造成一个代理
                    return requests.get(url, headers=headers, proxies=proxy, timeout=timeout) ##使用代理获取response
                except:
     
                    if num_retries > 0:
                        time.sleep(10)
                        IP = ''.join(str(random.choice(self.iplist)).strip())
                        proxy = {'http': IP}
                        print(u'正在更换代理,10S后将重新获取倒数第', num_retries, u'')
                        print(u'当前代理是:', proxy)
                        return self.get(url, timeout, proxy, num_retries - 1)
                    else:
                        print(u'代理也不好使了!取消代理')
                        return self.get(url, 3)
     
    request = download()  ##
    
    
    def mysql(title):
          conn= MySQLdb.connect(
                  host='127.0.0.1',
                  port = 3306,
                  user='root',
                  passwd='',
                  db ='test',
                  charset="utf8",
                  )
          cur = conn.cursor()
    
          sqli="insert into qiubai(text) values(%s)"
          cur.execute(sqli,(title))
          cur.close()
          conn.commit()
          conn.close()
    
    
    def qiushi(url):
          html = request.get(url, 3) 
          all_a = BeautifulSoup(html.text, 'lxml').find('div', class_='col1').find_all('div', class_='content')
          title_all = []
          for a in all_a:
            title = a.get_text()
     
            title_all.append(title)
          os.chdir("D:mzitu")
          f = open("111.txt", 'a')
          for i in title_all:
                x = i.encode("utf-8")  
                f.write(i.encode('utf-8'))
                f.write("
    ")
                s=mysql(i.encode('utf-8')) ##这句是保存一份到数据库中,如果没配置数据库的话,可以注释掉
                print(i.encode('utf-8'))          
          f.close()
    
    def page(url):
          headers = {'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"}
          content = requests.get(url, headers=headers)
          page_max = BeautifulSoup(content.text, 'lxml').find_all('span')[166].get_text()
          for i in range(1, int(page_max)+1):
                url_more = url + '/8hr/page/' + str(i) + '/?s=4933245'
                s = qiushi(url_more)
                print "================================已下载完第" + str(i) + "页================================"
                
          
    url = 'http://www.qiushibaike.com/'
    qiushi = page(url)

    最后下载完第一页, 第二页还是出不来。

    郁闷的是第一页能出来,说明调用 download()是成功执行了

    估计是糗百的还有其他的防爬虫吧,等以后再回来完善

    爬取”百思不得其姐”段子的前50页:

    # -*- coding: utf-8 -*-   
    
    import requests
    from bs4 import BeautifulSoup
    import os
    import codecs
    import MySQLdb
    import re
    import random
    import time
    
    class download():
     
        def __init__(self):
     
            self.iplist = []  ##初始化一个list用来存放我们获取到的IP
            html = requests.get("http://haoip.cc/tiqu.htm")  ##不解释咯
            iplistn = re.findall(r'r/>(.*?)<b', html.text, re.S)  ##表示从html.text中获取所有r/><b中的内容,re.S的意思是包括匹配包括换行符,findall返回的是个list哦!
            for ip in iplistn:
                i = re.sub('
    ', '', ip)  ##re.sub 是re模块替换的方法,这儿表示将
    替换为空
                self.iplist.append(i.strip())  ##添加到我们上面初始化的list里面
     
            self.user_agent_list = [
                "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
                "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
                "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
                "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
                "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
                "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",
                "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
                "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
                "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
                "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
                "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
                "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
                "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
                "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
                "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
                "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
                "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
                "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
            ]
     
        def get(self, url, timeout, proxy=None, num_retries=6): ##给函数一个默认参数proxy为空
            UA = random.choice(self.user_agent_list) ##从self.user_agent_list中随机取出一个字符串
            headers = {'User-Agent': UA}  ##构造成一个完整的User-Agent (UA代表的是上面随机取出来的字符串哦)
     
            if proxy == None: ##当代理为空时,不使用代理获取response(别忘了response啥哦!之前说过了!!)
                try:
                    return requests.get(url, headers=headers, timeout=timeout)##这样服务器就会以为我们是真的浏览器了
                except:##如过上面的代码执行报错则执行下面的代码
     
                    if num_retries > 0: ##num_retries是我们限定的重试次数
                        time.sleep(10) ##延迟十秒
                        print(u'获取网页出错,10S后将获取倒数第:', num_retries, u'')
                        return self.get(url, timeout, num_retries-1)  ##调用自身 并将次数减1
                    else:
                        print(u'开始使用代理')
                        time.sleep(10)
                        IP = ''.join(str(random.choice(self.iplist)).strip()) ##下面有解释哦
                        proxy = {'http': IP}
                        return self.get(url, timeout, proxy,) ##代理不为空的时候
     
            else: ##当代理不为空
                try:
                    IP = ''.join(str(random.choice(self.iplist)).strip()) ##将从self.iplist中获取的字符串处理成我们需要的格式(处理了些什么自己看哦,这是基础呢)
                    proxy = {'http': IP} ##构造成一个代理
                    return requests.get(url, headers=headers, proxies=proxy, timeout=timeout) ##使用代理获取response
                except:
     
                    if num_retries > 0:
                        time.sleep(10)
                        IP = ''.join(str(random.choice(self.iplist)).strip())
                        proxy = {'http': IP}
                        print(u'正在更换代理,10S后将重新获取倒数第', num_retries, u'')
                        print(u'当前代理是:', proxy)
                        return self.get(url, timeout, proxy, num_retries - 1)
                    else:
                        print(u'代理也不好使了!取消代理')
                        return self.get(url, 3)
     
    request = download()  ##
    
    def qiushi(url):
          os.chdir("D:mzitu")
          f = open("duanzi.txt", 'a')
          html =  request.get(url, 3)
          all_a = BeautifulSoup(html.text, 'lxml').find('div', class_='j-r-c').find_all('div', class_='j-r-list-c-desc')
          for a in all_a:
                b = a.get_text()
                print b
                f.write(b.encode('utf-8'))
    
    def page(url):
          for i in range(1, 50):
                os.chdir("D:mzitu")
                f = open("duanzi.txt", 'a')
                url_more = url + 'text/' + str(i)
                s = qiushi(url_more)
                print "================================已下载完第" + str(i) + "页================================"
                f.write( "
    ")
                f.write( "================================已下载完第" + str(i) + "页================================")
                f.write( "
    ")
          f.close()
    
    url = 'http://www.budejie.com/'
    qiushi = page(url)
  • 相关阅读:
    读《被绑架的中国经济》有感
    互联网世界观
    了解360 ~~《我的互联网方法论》
    了解腾讯~~《马化腾的商业帝国》
    nginx 动静分离 以及 负载均衡配置
    linux 常用命令
    solr 配置中文分词器
    solr搜索配置权重
    JDK8集合类源码解析
    JDK8集合类源码解析
  • 原文地址:https://www.cnblogs.com/tangbinghaochi/p/6098561.html
Copyright © 2011-2022 走看看