其实,最基本的抓站,两句话就可以了
import urllib2 content = urllib2.urlopen('http://XXXX').read()
http://www.lovelucy.info/python-crawl-pages.html
并行处理/出墙
http://wuchong.me/blog/2014/04/24/easy-web-scraping-with-python/
import argparse import re from multiprocessing import Pool import requests import bs4
爬淘宝MM,生成文件夹和图片
http://cuiqingcai.com/1001.html
import urllib import urllib2 import re import tool import os
Python爬虫入门六之Cookie的使用
http://cuiqingcai.com/968.html
import urllib import urllib2 import cookielib
创建一个带有cookie的opener,在访问登录的URL时,将登录后的cookie保存下来,然后利用这个cookie来访问其他网址。
正则的使用和re模块介绍
http://cuiqingcai.com/977.html
re.compile(string[,flag]) #以下为匹配所用函数 re.match(pattern, string[, flags]) re.search(pattern, string[, flags]) re.split(pattern, string[, maxsplit]) re.findall(pattern, string[, flags]) re.finditer(pattern, string[, flags]) re.sub(pattern, repl, string[, count]) re.subn(pattern, repl, string[, count])
-----------------------------------------------------------
例子:
content = response.read().decode('utf-8') pattern = re.compile('<div.*?author">.*?<a.*?<img.*?>(.*?)</a>.*?<div.*?'+ 'content">(.*?)<!--(.*?)-->.*?</div>(.*?)<div class="stats.*?class="number">(.*?)</i>',re.S) items = re.findall(pattern,content) for item in items: print item[0],item[1],item[2],item[3],item[4]
现在正则表达式在这里稍作说明
1).*? 是一个固定的搭配,.和*代表可以匹配任意无限多个字符,加上?表示使用非贪婪模式进行匹配,也就是我们会尽可能短地做匹配,以后我们还会大量用到 .*? 的搭配。
2)(.*?)代表一个分组,在这个正则表达式中我们匹配了五个分组,在后面的遍历item中,item[0]就代表第一个(.*?)所指代的内容,item[1]就代表第二个(.*?)所指代的内容,以此类推。
3)re.S 标志代表在匹配时为点任意匹配模式,点 . 也可以代表换行符。
这样我们就获取了发布人,发布时间,发布内容,附加图片以及点赞数。
过滤有图片的新闻
保存到数据库:
http://cuiqingcai.com/1972.html
2.页码保存
爬虫爬取过程中可能出现各种各样的错误,这样会导致爬虫的中断,如果我们重新运行爬虫,那么就会导致爬虫从头开始运行了,这样显然是不合理的。所以,我们需要把当前爬取的页面保存下来,比如可以保存到文本中,假如爬虫中断了,重新运行爬虫,读取文本文件的内容,接着爬取即可。
def main(self): f_handler=open('out.log', 'w') sys.stdout=f_handler page = open('page.txt', 'r') content = page.readline() start_page = int(content.strip()) - 1 page.close() print self.getCurrentTime(),"开始页码",start_page print self.getCurrentTime(),"爬虫正在启动,开始爬取爱问知识人问题" self.total_num = self.getTotalPageNum() print self.getCurrentTime(),"获取到目录页面个数",self.total_num,"个" if not start_page: start_page = self.total_num for x in range(1,start_page): print self.getCurrentTime(),"正在抓取第",start_page-x+1,"个页面" try: self.getQuestions(start_page-x+1) except urllib2.URLError, e: if hasattr(e, "reason"): print self.getCurrentTime(),"某总页面内抓取或提取失败,错误原因", e.reason except Exception,e: print self.getCurrentTime(),"某总页面内抓取或提取失败,错误原因:",e if start_page-x+1 < start_page: f=open('page.txt','w') f.write(str(start_page-x+1)) print self.getCurrentTime(),"写入新页码",start_page-x+1 f.close()
3.页面处理
页面处理过程中,我们可能遇到各种各样奇葩的HTML代码,和上一节一样,我们沿用一个页面处理类即可。
import re #处理页面标签类 class Tool: #将超链接广告剔除 removeADLink = re.compile('<div class="link_layer.*?</div>') #去除img标签,1-7位空格, removeImg = re.compile('<img.*?>| {1,7}| ') #删除超链接标签 removeAddr = re.compile('<a.*?>|</a>') #把换行的标签换为\n replaceLine = re.compile('<tr>|<div>|</div>|</p>') #将表格制表<td>替换为\t replaceTD= re.compile('<td>') #将换行符或双换行符替换为\n replaceBR = re.compile('<br><br>|<br>') #将其余标签剔除 removeExtraTag = re.compile('<.*?>') #将多行空行删除 removeNoneLine = re.compile('\n+') def replace(self,x): x = re.sub(self.removeADLink,"",x) x = re.sub(self.removeImg,"",x) x = re.sub(self.removeAddr,"",x) x = re.sub(self.replaceLine,"\n",x) x = re.sub(self.replaceTD,"\t",x) x = re.sub(self.replaceBR,"\n",x) x = re.sub(self.removeExtraTag,"",x) x = re.sub(self.removeNoneLine,"\n",x) #strip()将前后多余内容删除 return x.strip()
更多: http://cuiqingcai.com/category/technique/python