第一次爬虫————爬取地震数据

import urllib.request
import requests
import turtle
import matplotlib.pyplot as plt
from bs4 import BeautifulSoup
def readhtml(url):
    try:
        head={}
        data={}
        head['User-Agent']="Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36"
        req=urllib.request.Request(url,data,head)
        response=urllib.request.urlopen(req)
        html=response.read()
        html=html.decode('utf-8')
        return html
    except:
        return ""
def analyze(html,alist,datalinks):
    soup=BeautifulSoup(html,'html.parser')
    datalinks=soup.find_all('tr')
    for i in datalinks:
        x=i.find_all('td')
        if len(x)==0:
            continue
        blist=[]
        for y in x:
            blist.append(y.string)
        alist.append(blist)
def datacollect(alist,ilist):
        for i in range(30):
            x=alist[i]
            ilist.append(int(x[4]))
def filedeal(alist):
    lines=[]
    g=["震级大小","时间","经度","纬度","震源深度","地点"]
    s='\t'.join([g[0],g[1],g[2],g[3],g[4],g[5]])
    s=s+'\n'
    lines.append(s)
    for i in range(30):
        x=alist[i]
        s='\t'.join([x[0],x[1],x[2],x[3],x[4],x[5]])
        s=s+'\n'
        lines.append(s)
    file=open(r'C:\Users\Administrator\Desktop\earthquake.xls','w')
    file.writelines(lines)
    file.close()
def collecttime(alist,plist,olist):
    for i in range(30):
        x=alist[i]
        plist.append(str(x[1]))
    for y in plist:
         i=y.replace(' ','')
         g=i.replace('-','')
         v=g.replace(':','')
         w=int(v)
         w=w+1
         e=str(w)
         olist.append(e)   
def filetohtml(alist,olist):
    txt='<table border="1">'
    txt=txt+'\n'+'<h1 style="text-align:center">'+"最新地震信息"+'</h1>'
    txt=txt+'\n'+'<tr>'
    g=["震级大小","时间","经度","纬度","震源深度","地点"]
    for f in range(6):
            txt=txt+'\n'+"<td>"+str(g[f])+"</td>"
    txt=txt+'\n'+'</tr>'
    for i in range(30):
        txt=txt+'\n'+'<tr>'
        x=alist[i]
        for f in range(6):
            if f<5:
                txt=txt+'\n'+"<td>"+str(x[f])+"</td>"
            else:
                txt=txt+'\n'+"<td>"+"<a href="'http://news.ceic.ac.cn/CD'+olist[i]+'.html'">"+str(x[f])+"</a>"+"</td>"
        txt=txt+'\n'+'</tr>'
    txt=txt+'\n'+'</table>'
    txt=txt+'\n'+'<h2 style="text-align:center">'+"地震网站链接"+'</h2>'
    txt=txt+'\n'+"<a href="'http://www.ceic.ac.cn/'">"+"中国地震台网"+"</a>"
    txt=txt+'\n'+"<a href="'https://earthquake.usgs.gov/earthquakes/map/'">美国地质勘探局</a>"
    txt=txt+'\n'+"<a href="'https://www.emsc-csem.org/#2'">欧洲地中海地震观测中心</a>"
    fileh=open(r'C:\Users\Administrator\Desktop\earthquake.html','w')
    fileh.write(txt)
    fileh.close()
def draw(ilist):
    yValues = ilist
    t = turtle.Turtle()
    t.hideturtle()
    drawLine(t,0,0,300,0) 
    drawLine(t,0,0,0,175) 
    for i in range(6):
        drawLineWithDots(t,40 + (40 * i),15 * yValues[i],40 + (40 * (i+1)),15 * (yValues[i+1]),"blue")
    drawTickMarks(t,yValues)
    displayText(t,yValues)
def drawLine(t,x1,y1,x2,y2,colorP="black"):
    t.up()
    t.goto(x1,y1)
    t.down()
    t.pencolor(colorP)
    t.goto(x2,y2)
def drawLineWithDots(t,x1,y1,x2,y2,colorP="black"):
    t.pencolor(colorP)
    t.up()
    t.goto(x1,y1)
    t.dot(5)
    t.down()
    t.goto(x2,y2)
    t.dot(5)
def drawTickMarks(t,yValues):
    for i in range(1,8):
        drawLine(t,40*i,0,40*i,10) 
    drawLine(t,0,15 * max(yValues), 10, 15*max(yValues)) 
    drawLine(t,0,15 * min(yValues), 10, 15*min(yValues))
def displayText(t,yValues):
    t.pencolor("blue")
    t.up()
    t.goto(-10,(15*max(yValues))-8)
    t.write(max(yValues),align="center")
    t.goto(-10,(15*min(yValues))-8)
    t.write(min(yValues),align="center")
    x = 40
    for i in range(0,20,2):
        t.goto(x,-20)
        t.write(str(i),align="center")
        x += 40
    t.goto(0,-50)
    t.write("地震震源深度分析表",font=("Arial",16,"normal"))
def getxy(alist,xlist,ylist):
    for i in range(30):
        x=alist[i]
        xlist.append(int(float(x[2])))
        ylist.append(int(float(x[3])))
def drawaddress(xlist,ylist):
    plt.title("地震信号分析表") 
    plt.subplot()
    plt.xlim(xmax=1800,xmin=-1800)    
    plt.ylim(ymax=900,ymin=-900)      
    plt.xlabel("x")
    plt.ylabel("y")
    plt.plot(xlist,ylist,'k^') 
    plt.show()
def main():
    print("地震信息收集系统")
    alist=[]
    ilist=[]
    datalinks=[]
    xlist=[]
    ylist=[]
    olist=[]
    plist=[]
    url="http://www.ceic.ac.cn/"
    html=readhtml(url)
    analyze(html,alist,datalinks)
    collecttime(alist,plist,olist)
    filedeal(alist)
    filetohtml(alist,olist)
    datacollect(alist,ilist)
    getxy(alist,xlist,ylist)
    draw(ilist)
    drawaddress(xlist,ylist)
if __name__=='__main__':
    main()
  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供爬虫教程,以下是使用Scrapy框架豆瓣电影TOP250的步骤: 1. 创建Scrapy项目 首先需要使用Scrapy命令行工具创建一个Scrapy项目,可以使用以下命令: ``` scrapy startproject douban_top250 ``` 该命令将会在当前目录下创建一个名为douban_top250的Scrapy项目。 2. 创建Spider 接下来需要创建一个Spider来定义的规则,可以使用以下命令在Scrapy项目的spiders目录下创建一个名为douban_spider的Spider: ``` scrapy genspider douban_spider movie.douban.com ``` 在spiders目录下会生成一个名为douban_spider.py的文件,我们可以在该文件中定义规则。 3. 编写Spider规则 在douban_spider.py文件中,我们需要定义如何豆瓣电影TOP250的规则,以下是一个简单的例子: ```python import scrapy from scrapy import Selector from douban_top250.items import DoubanTop250Item class DoubanSpider(scrapy.Spider): name = "douban_spider" allowed_domains = ["movie.douban.com"] start_urls = [ "https://movie.douban.com/top250" ] def parse(self, response): selector = Selector(response) item_list = selector.xpath('//ol[@class="grid_view"]/li') for item in item_list: douban_item = DoubanTop250Item() douban_item['rank'] = item.xpath('div[@class="pic"]/em/text()').extract()[0] douban_item['title'] = item.xpath('div[@class="info"]/div[@class="hd"]/a/span[@class="title"]/text()').extract()[0] douban_item['rating'] = item.xpath('div[@class="info"]/div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()').extract()[0] douban_item['quote'] = item.xpath('div[@class="info"]/div[@class="bd"]/p[@class="quote"]/span[@class="inq"]/text()').extract()[0] yield douban_item ``` 在上述代码中,我们定义了一个名为DoubanSpider的Spider,并定义了一些规则: - allowed_domains:定义允许的域名; - start_urls:定义爬虫开始的URL列表; - parse:定义如何解析响应结果,生成Item对象。 4. 定义Item 在上述代码中,我们定义了一个名为DoubanTop250Item的Item,需要在douban_top250/items.py文件中定义该Item,以下是一个简单的例子: ```python import scrapy class DoubanTop250Item(scrapy.Item): rank = scrapy.Field() title = scrapy.Field() rating = scrapy.Field() quote = scrapy.Field() ``` 在上述代码中,我们定义了DoubanTop250Item包含以下字段: - rank:电影排名; - title:电影名称; - rating:电影评分; - quote:电影的经典语录。 5. 运行Spider 在完成上述步骤后,就可以运行Spider开始豆瓣电影TOP250了,可以通过以下命令来运行Spider: ``` scrapy crawl douban_spider -o douban_top250.csv ``` 该命令将会运行名为douban_spider的Spider,并将结果保存到douban_top250.csv文件中。 以上就是使用Scrapy豆瓣电影TOP250的基本步骤,希望能对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值