import urllib.request
import os
import re
import time
import socket
from bs4 import BeautifulSoup
def crawerEach(url,urldir):
resp=urllib.request.urlopen(url)
html=resp.read().decode('gbk')
soup = BeautifulSoup(html)
items=soup.find('body').find('div',id='main').find(name='div',attrs={"class":"t","style":"margin:3px auto"}
).find('table',id='ajaxtable'
).find("tbody").findAll(name="tr",attrs={"class":"tr3 t_one"})
for item in items:
target=item.find(name='td',attrs={"style":"text-align:left;padding-left:8px"}).find('h3').find('a')
if target.u == None and target.b == None and target.font == None:
urldir[target.text] = "http://wo.yao.cl/"+target.get('href')
return urldir
#爬下所有文章的标题的URL地址
def crawer():
urldir={}
for i in range(39):
url="http://wo.yao.cl/thread0806.php?fid=20&page="+str(i+1)
print("=====================正在爬取第"+str(i+1)+"页=========")
urldir=crawerEach(url,urldir)
f=open("all.xml",'w',encoding="utf-8")
for key,url in urldir.items() :
firstColumn="<article title="+"\""+key+"\">"
secondColumn=" "+"<url>"+url+"</url>"
thirdColumn="</article>"
f.write(firstColumn+'\n'+secondColumn+'\n'+thirdColumn+'\n')
f.close()
#以文章的标题模糊搜索
def search():
keyword = input("请输入关键字:")
file=open("all.xml",'r',encoding='utf-8')
content=file.read()
soup=BeautifulSoup(content)
items=soup.findAll(name="article",attrs={"title":re.compile(keyword)})
for item in items:
print(item.get('title') + item.text)
#获得文章内容
def getContent(soup , author ,url, pageAccount):
contents = soup.body.find(name='div',attrs={'id':'main'}).findAll(name='div',attrs={'class':'t t2'})
tid = url[-12:]
print (tid)
#获得首页的文章内容
for item in contents:
if(item.find('table').find(name='tr',attrs={'class':'tr3 tr1'}).find('font').b.text == author):
content = item.table.find(name='tr',attrs={'class':'tr3 tr1'}).find(name='th',attrs={'class':'r_one'}
).table.tr.td.find(name='div',attrs={'class':'tpc_content'}).text
writeContent(content)
print(content)
print("")
pageInt = int(pageAccount)
i = 2
while i<=pageInt:
pageUrl = "http://wo.yao.cl/read.php?tid=" + tid + "&page=" + str(i)
print(pageUrl)
getAuthorFloorContent(pageUrl,author)
i=i+1
print(pageUrl)
#把内容写入文件
def writeContent(content):
f=open('content1.txt','a',encoding='utf-8')
f.write(content)
f.write('\n')
f.write('\n')
f.write('\n')
f.write('\n')
f.close()
'''以下为获得内容所做的准备'''
#获得第2页以后的页面的作者的楼层中的内容
def getAuthorFloorContent(pageUrl,author):
resp=urllib.request.urlopen(pageUrl)
html=resp.read().decode('gbk')
soup = BeautifulSoup(html)
#获得所有楼层
contents = soup.body.find(name='div',attrs={'id':'main'}).findAll(name='div',attrs={'class':'t t2'})
for item in contents:
#在所有楼层中选出作者的楼层
if(item.find('table').find(name='tr',attrs={'class':'tr1'}).find(name='th',attrs={'class':'r_two'}).b.text == author):
content = item.table.find(name='tr',attrs={'class':'tr1'}).find(name='th',attrs={'class':'r_one'}
).find(name='div',attrs={'class':'tpc_content'}).text
writeContent(content)
print(content)
print("")
#获得帖子中共有多少页
def getContentPage(soup):
divItems = soup.body.find('div',id='main').findAll(name='div',attrs={'class':'t3'})
#获得页数的节点
pageAccounts = divItems[2].table.tr.td.find(name='div',attrs={'class':'pages'}).findAll(name='a',attrs={'style':None})
pageAccount = pageAccounts[len(pageAccounts)-1].text
print("页数为:" + pageAccount)
return pageAccount
#获得作者名字
def getAuthor(soup):
author = soup.body.find('div',id='main').find(name='div',attrs={'class':'t t2'}
).find('table').find(name='tr',attrs={'class':'tr3 tr1'}).find('font').b.text
print("作者为:" + author)
return author
#获得文章
def getArtilcle(url):
resp=urllib.request.urlopen(url)
html=resp.read().decode('gbk')
soup = BeautifulSoup(html)
#取得帖子的页数
account = getContentPage(soup)
#取得文章的作者
author = getAuthor(soup)
#取得内容,并将内容存入txt
content = getContent(soup , author ,url ,account)
#获得图片
def getPicture(url):
#url="http://wo.yao.cl/htm_data/8/1412/1313643.html"
resp=urllib.request.urlopen(url)
soup = BeautifulSoup(resp)
contents = soup.body.find(name='div',attrs={'id':'main'}).findAll(name='div',attrs={'class':'t t2'})
#获得网页内容
for item in contents:
pictures = item.table.find(name='tr',attrs={'class':'tr3 tr1'}).find(name='th',attrs={'class':'r_one'}
).table.tr.td.find(name='div',attrs={'class':'tpc_content'}).findAll(name='input')
i = 0
for tag in pictures:
print(tag['src'])
conn = urllib.request.urlopen(tag['src'])
f=open(str(i)+".jpg",'wb')
i=i+1
f.write(conn.read())
f.close()
resp.close();
if __name__ == "__main__":
print("1--更新")
print("2--查询")
print("3--取得文章")
print("4--取得图片")
choose=input("请输入结果:")
if choose=="1":
crawer()
else :
if choose=="3":
url = input("请输入文章的网址:")
getArtilcle(url)
else:
if choose=="4":
url = input("请出入图片的网址:")
getPicture(url)
else:
search()
print("The End")
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获取。 请求网页: 爬虫使用HTTP或其他协议向目标URL发起请求,获取网页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 爬虫对获取的HTML进行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用爬虫需要遵守法律和伦理规范,尊重网站的使用政策,并确保对被访问网站的服务器负责。
资源推荐
资源详情
资源评论
收起资源包目录
基于python的1024爬虫,可爬下1024的文章和图片放到当前目录上。.zip (1个子文件)
SJT-code
1024crawler.py 6KB
共 1 条
- 1
资源评论
JJJ69
- 粉丝: 6223
- 资源: 5780
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- ModStartCMS v8.4.0 框架稳定性持续迭代,修复部分已知问题
- bleder 教室学校学生教育室办公室考试
- 人脸检测-使用OpenCV实现的动漫+漫画人脸检测算法-附项目源码-优质项目实战.zip
- 道路贴图,材质材料免费
- 人脸检测-基于OpenCV+Node.js+WebSockets实现的实时人脸检测应用-附项目源码-优质项目实战.zip
- 一些常见的MySQL死锁案例-mysql-deadlocks-master(源代码+案例+图解说明)
- UE4动画烘焙器-ue4.27
- 新建文件夹.zip
- 1103a2a791bbd96ea98021062e327495b1c422e32fb27e0c2d6404b1bd74b692.gif
- 同城相亲交友php小程序
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功