python爬虫初尝试
前几天在做大作业的时候需要一些数据,然后就没事干研究了一下用python写了个爬虫
#!/usr/bin/python # -*- coding: UTF-8 -*- import sys reload(sys) sys.setdefaultencoding('utf-8') import pycurl import time import StringIO import re from bs4 import BeautifulSoup import urllib def has_ch(str): zhPattern=re.compile(u'[\u4e00-\u9fa5]+') return zhPattern.search(str) def urlencode(str): reprStr=repr(str).replace(r'\x','%') return reprStr[1:-1] obj=open("webtinker","w+") #reg=r"(?=(<([^<>]*)>[^<>/]*</\1>))" #reg=r"?=<\s*(\S+)(\s[^>]*)?>[\s\S]*<\s*\/\1\s*>" lst=[] def digui(url,num): global obj,lst lst.append(url) if (num>5): return 0 print "pending "+str(num)+" "+url b=StringIO.StringIO() c=pycurl.Curl() c.setopt(pycurl.MAXREDIRS,5) c.setopt(c.URL,url) c.setopt(c.WRITEFUNCTION,b.write) c.setopt(pycurl.SSL_VERIFYPEER,0) c.setopt(pycurl.SSL_VERIFYHOST,0) c.setopt(pycurl.CONNECTTIMEOUT,1) try: c.perform() except pycurl.error,error: errno, errstr=error print 'An error occurred: ',errstr c.close() else: html=b.getvalue() httpcode=c.getinfo(pycurl.HTTP_CODE) c.close() b.close() if (httpcode!=200): print "error "+url else: soup=BeautifulSoup(html,"html.parser") obj.write(url+"\t"+str(len(soup.find_all("a")))+"\t"+str(len(soup.find_all("div")))+"\t"+str(len(soup.find_all("p")))+"\t"+str(len(soup.find_all("img")))+"\n") for anchor in soup.find_all("a"): href=anchor.get("href") if (href and href[0:1]=="/" and not has_ch(href)): target="https://www.web-tinker.com"+href if not target in lst: digui(target,num+1) digui("https://www.web-tinker.com/",0) obj.close()
其实原理非常简单,用curl爬网页,然后用beautifulsoup解析标签,记录下每个页面的a、div、img、p标签数量,对所有符合条件的a标签进行下一级爬取,采用递归的方法控制爬的层数
只是有一个问题,就是一开始当爬取的url含有非ascii字符时都会报错,然后编写的urlencode函数又非常奇怪,所以不得已只爬取了纯英文的url,不知道是怎么回事有没有什么解决方案
2016
06 09
上一篇
Older
下一篇
Newer
评论
0
点击
2097