完善爬取糗百的段子
# -*- 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('\n', '', ip) ##re.sub 是re模块替换的方法,这儿表示将\n替换为空 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("\n") 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('\n', '', ip) ##re.sub 是re模块替换的方法,这儿表示将\n替换为空 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( "\n") f.write( "================================已下载完第" + str(i) + "页================================") f.write( "\n") f.close() url = 'http://www.budejie.com/' qiushi = page(url)