代码例子如下:
headers=("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/38.0.2125.122 Safari/735.36 SE 2.X MetaSr 1.0")
opener =urllib.request.build_opener()
opener.addheaders=[headers]
urllib.request.install_opener(opener)
有些网站可以识别访问者是不是浏览器还是爬虫这类自动访问程序访问网站,如果不是浏览器就会禁止访问,而浏览器的伪装可以在一定程度上骗多这种识别。
不过这个代码是比较简单的浏览器伪装。
现在贴出相似度比较高的模拟浏览器的代码:
headers={"Accept":" text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Encoding":" gb2312,uef-8",
"Accept-Language":" zh-CN,zh;q=0.8,en-US,q=0.5,en;q=0.3",
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/38.0.2125.122 Safari/735.36 SE 2.X MetaSr 1.0",
"Connection": "keep-alive",
"referer":"baidu.com"}
cjar=http.cookiejar.CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cjar))
headall=[]
for key,value in headers.items():
item=(key,value)
headall.append(item)
opener.addheaders = headall
urllib.request.install_opener(opener)
将韩师新闻中心开始进行爬取新闻网址,使用 ‘class=“menu0_0_” href="(.*?).htm"> 使用循环将学校要闻中的新闻进行翻页爬取新闻的网址,存进一个列表中news_listurl,
对于循环的终止条件可设为:
except urllib.error.URLError as e:
if hasattr(e,"code"):
if e.code ==404:
Break
使用:for url in listur:
if url not in news_listurl:
news_listurl.append(url)
对新闻网址进行去重复处理。
注:
对于网址的重复的处理也可以将已经爬取的新闻网址存进一个列表,如果爬取新闻网址时可以对列表进行查重,重复就不能保存并爬取了。当爬取新闻是也一样,对将要爬取的新闻进行对比,重复则不用在进行爬取了。(可用于多线程爬虫)
以往的建立列表方式是这样的:
try:
c.execute('''CREATE TABLE News(id int,name text,content text)''') #建立保存文字的表。
c.execute('''CREATE TABLE Tupian(picture BOLB)''') #建立保存图片的表。
print("建立 表成功!!!\n\n")
except:
print("表-创建成功!")
原来建立的表是将存文字跟存图片分为两个表,如果只是爬取一个新闻就很好存储处理,也比较简单操作,存入读取都方便。但是当爬取多个网页时就不科学了,不可能每爬取一个网页就建立两个表吧!
根据爬取新闻的需求,我修改了以往存储文字跟图片时的建立表的方式。代码如下:
try:
c.execute('''CREATE TABLE News(ID INT ,NO INT,name text,content longtext,picture1 BOLB,picture2 BOLB,picture3 BOLB,picture4 BOLB,picture5 BOLB)''')
print("表-Students创建成功!\n")
except:
print("表-Students创建成功!")
这样建立一个表就将一个新闻的文字跟图片都存入数据库中。其中图片的可以有多个,有几个图片就存入几个变量中。
我使用这样的结构配合这个存储新闻的表:
try:
conn.execute("INSERT INTO News(ID,name,content) VALUES(?,?,?)",(k,imglist3[0],text,))
conn.commit()
n=len(pictures)
if 1<=n:
conn.execute("update News set NO=(?) where ID=(?)",(n,k,))
conn.execute("update News set picture1=(?) where ID=(?)",(pictures[0],k,))
if 2<=n:
conn.execute("update News set picture2=(?) where ID=(?)",(pictures[1],k,))
if 3<=n:
conn.execute("update News set picture3=(?) where ID=(?)",(pictures[2],k,))
if 4<=n:
conn.execute("update News set picture4=(?) where ID=(?)",(pictures[3],k,))
if 5<=n:
conn.execute("update News set picture5=(?) where ID=(?)",(pictures[4],k,))
conn.commit()
c.close()
conn.close()
print("保存进数据库成功!!!")
except:
print("保存进数据库失败!!!")
先判断每个新闻的图片有多少张,然后依次存入数据库中。
爬取新闻时,使用 imglist3 = htmll.xpath(’//h1/descendant::text()’) 的式子将新闻的标题找到并赋值给imglist3,使用 imglist2=htmll.xpath(’//p/descendant::text()’) 的式子将新闻的正文找到并赋值给imglist2
爬起新闻中的图片比较麻烦,需要将图片从网页上下载到电脑中,
urllib.request.urlretrieve(imgurl, “D:/计科5181/xinwen{}.jpg”.format(x)) #将图片下载到电脑中
再将电脑中的图片转变为字节,将字节保存进数据库中。
with open(“D:/计科5181/xinwen{}.jpg”.format(i), “rb”) as f:
res=base64.b64encode(f.read()) #将图片转换为字节。
当读取图片时也一样,先将字节转换为图片保存在电脑中,在调用函数将图片输出界面。
for variate in c.fetchall():
img=base64.b64decode(variate[0])
file=open(“D:/计科5181/tupian/s{}.jpg”.format(i),‘wb’) #将图保存到电脑中
file.write(img)
file.close()
img=mping.imread(“D:/计科5181/tupian/s{}.jpg”.format(i)) #读取图片的路径。
plt.imshow(img)
plt.axis(‘off’)#不显示坐标轴
plt.show() #显示图片
time.sleep(2)
i+=1