Python爬虫与AI结合,营造论文接龙程序!

2019-10-04 12:02栏目:编程学习

介绍

正文将呈现什么行使Python爬虫来落到实处随想接龙。 该项目的思绪如下:

  1. 运用爬虫爬取诗歌,制作散文语言材质库;
  2. 将散文分句,形成字典:键为该句首字的拼音,值为该拼音对应的诗词,并将字典保存为pickle文件;
  3. 读取pickle文件,编写程序,以exe文件情势运转该程序。
 号:960410445 群里有志同道合的小伙伴,互帮互助, 群里有不错的视频学习教程和PDF!

该品种落到实处的诗篇接龙,准绳为下一句的首字与上一句的尾字的拼音一致。上边将分步呈报该项目标完毕进度。

python爬虫scrapy项目

诗文语言材质库

首先,大家应用Python爬虫来爬取随笔,制作语言材质库。爬取的网站为:

图片 1爬取的杂文

由于本文首要为试了体现该品种的思路,由此,只爬取了该页面中的宋词三百首、古诗三百、唐诗三百、唐诗精选,一共差相当少1100多首随笔。为了加紧爬虫,采纳并发达成爬虫,并保存到poem.txt文件。完整的Python程序如下:

import reimport requestsfrom bs4 import BeautifulSoupfrom concurrent.futures import ThreadPoolExecutor, wait, ALL_COMPLETED# 爬取的诗歌网址urls = ['https://so.gushiwen.org/gushi/tangshi.aspx', 'https://so.gushiwen.org/gushi/sanbai.aspx', 'https://so.gushiwen.org/gushi/songsan.aspx', 'https://so.gushiwen.org/gushi/songci.aspx' ]poem_links = []# 诗歌的网址for url in urls: # 请求头部 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36'} req = requests.get(url, headers=headers) soup = BeautifulSoup(req.text, "lxml") content = soup.find_all('div', class_="sons")[0] links = content.find_all for link in links: poem_links.append('https://so.gushiwen.org' link['href'])poem_list = []# 爬取诗歌页面def get_poem: #url = 'https://so.gushiwen.org/shiwenv_45c396367f59.aspx' # 请求头部 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36'} req = requests.get(url, headers=headers) soup = BeautifulSoup(req.text, "lxml") poem = soup.find('div', class_='contson').text.strip() poem = poem.replace poem = re.sub(re.compile(r"([sS]*?)"), '', poem) poem = re.sub(re.compile(r""), '', poem) poem = re.sub(re.compile(r"。"), '', poem) poem = poem.replace.replace poem_list.append# 利用并发爬取executor = ThreadPoolExecutor(max_workers=10) # 可以自己调整max_workers,即线程的个数# submit()的参数: 第一个为函数, 之后为该函数的传入参数,允许有多个future_tasks = [executor.submit(get_poem, url) for url in poem_links]# 等待所有的线程完成,才进入后续的执行wait(future_tasks, return_when=ALL_COMPLETED)# 将爬取的诗句写入txt文件poems = list(set(poem_list))poems = sorted(poems, key=lambda x:lenfor poem in poems: poem = poem.replace.replace  .replace.replace print with open('F://poem.txt', 'a') as f: f.write f.write

该程序爬取了1100多首小说,并将杂谈保存至poem.txt文件,变成大家的诗句语料库。当然,那几个随想并不能够从来动用,必要清理数据,比如有个别诗歌标点不三不四,有个别并非故事集,只是随笔的序等等,那么些进度必要人工操作,尽管稍显麻烦,但为了后边的诗句分句效果,也是值得的。

  爬取指标:365房产网全国租房消息网站(开端url:

诗文分句

有了随想语言材质库,大家供给对随笔进行分句,分句的标准为:依照结尾为。?!进行分句,那能够用正则表明式完结。之后,将分句好的诗句写成字典:键为该句首字的拼音,值为该拼音对应的诗篇,并将字典保存为pickle文件。完整的Python代码如下:

import reimport picklefrom xpinyin import Pinyinfrom collections import defaultdictdef main(): with open('F://poem.txt', 'r') as f: poems = f.readlines() sents = [] for poem in poems: parts = re.findall(r'[sS]*?[。?!]', poem.strip for part in parts: if len >= 5: sents.append poem_dict = defaultdict for sent in sents: print head = Pinyin().get_pinyin(sent, tone_marks='marks', splitter=' ').split()[0] poem_dict[head].append with open('./poemDict.pk', 'wb') as f: pickle.dump(poem_dict, f)main()

大家得以看一下该pickle文件(poemDict.pk)的开始和结果:

图片 2pickle文件的情节

本来,一个拼音能够对应四个散文。

  爬取内容:城市;名字;出租汽车格局;价格;户型;面积;地址;交通

杂谈接龙

读取pickle文件,编写程序,以exe文件格局运维该程序。 为了能够在编写翻译产生exe文件的时候不不可靠赖,大家须要改写xpinyin模块的init.py文件,将该公文的全体代码复制至mypinyin.py,并将代码中的下边那句代码

data_path = os.path.join(os.path.dirname(os.path.abspath), 'Mandarin.dat')

改写为

data_path = os.path.join(os.getcwd(), 'Mandarin.dat')

这么我们就完事了mypinyin.py文件。 接下来,大家须要编写制定杂文接龙的代码(Poem_Jielong.py),完整代码如下:

import picklefrom mypinyin import Pinyinimport randomimport ctypesSTD_INPUT_HANDLE = -10STD_OUTPUT_HANDLE = -11STD_ERROR_HANDLE = -12FOREGROUND_DARKWHITE = 0x07 # 暗白色FOREGROUND_BLUE = 0x09 # 蓝色FOREGROUND_GREEN = 0x0a # 绿色FOREGROUND_SKYBLUE = 0x0b # 天蓝色FOREGROUND_RED = 0x0c # 红色FOREGROUND_PINK = 0x0d # 粉红色FOREGROUND_YELLOW = 0x0e # 黄色FOREGROUND_WHITE = 0x0f # 白色std_out_handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)# 设置CMD文字颜色def set_cmd_text_color(color, handle=std_out_handle): Bool = ctypes.windll.kernel32.SetConsoleTextAttribute(handle, color) return Bool# 重置文字颜色为暗白色def resetColor(): set_cmd_text_color(FOREGROUND_DARKWHITE)# 在CMD中以指定颜色输出文字def cprint(mess, color): color_dict = { '蓝色': FOREGROUND_BLUE, '绿色': FOREGROUND_GREEN, '天蓝色': FOREGROUND_SKYBLUE, '红色': FOREGROUND_RED, '粉红色': FOREGROUND_PINK, '黄色': FOREGROUND_YELLOW, '白色': FOREGROUND_WHITE } set_cmd_text_color(color_dict[color]) print resetColor()color_list = ['蓝色','绿色','天蓝色','红色','粉红色','黄色','白色']# 获取字典with open('./poemDict.pk', 'rb') as f: poem_dict = pickle.load#for key, value in poem_dict.items(): #print(key, value)MODE = str(input('Choose MODE(1 for 人工接龙, 2 for 机器接龙): '))while True: try: if MODE == '1': enter = str(input('n请输入一句诗或一个字开始:')) while enter != 'exit': test = Pinyin().get_pinyin(enter, tone_marks='marks', splitter=' ') tail = test.split()[-1] if tail not in poem_dict.keys(): cprint('无法接这句诗。n', '红色') MODE = 0 break else: cprint('n机器回复:%s'%random.sample(poem_dict[tail], 1)[0], random.sample(color_list, 1)[0]) enter = str(input[:-1] MODE = 0 if MODE == '2': enter = input('n请输入一句诗或一个字开始:') for i in range: test = Pinyin().get_pinyin(enter, tone_marks='marks', splitter=' ') tail = test.split()[-1] if tail not in poem_dict.keys(): cprint('------>无法接下去了啦...', '红色') MODE = 0 break else: answer = random.sample(poem_dict[tail], 1)[0] cprint--> %s' % (i 1, answer), random.sample(color_list, 1)[0]) enter = answer[:-1] print('n(*****最多展示前10回接龙。*****)') MODE = 0 except Exception as err: print finally: if MODE not in ['1','2']: MODE = str(input('nChoose MODE(1 for 人工接龙, 2 for 机器接龙): '))

今昔一切项目的构造如下(Mandarin.dat文件从xpinyin模块对应的文书夹下复制过来):

图片 3体系文件

切换至该文件夹,输入以下命令就可以生成exe文件:

pyinstaller -F Poem_jielong.py

生成的exe文件为Poem_jielong.exe,位于该文件夹的dist文件夹下。为了能够让exe成功运营,供给将poemDict.pk和曼达rin.dat文件复制到dist文件夹下。

  反反爬措施:设置随机user-agent、设置必要延时操作、

测量试验运营

运行Poem_jielong.exe文件,页面如下:

图片 4exe文件初阶页面

本项目标诗词接龙有三种形式,一种为人工接龙,正是您先输入一句诗或四个字,然后就是Computer回复一句,你回复一句,肩负杂谈接龙的条条框框;另一种形式为机械接龙,正是您先输入一句诗或三个字,机器会活动输出前边的接龙诗句。 先测量试验人工接龙形式:

图片 5人造接龙

再测量检验机器接龙方式:

图片 6机械接龙

1、初叶创设项目

1 scrapy startproject fang

总结

该类型的Github地址为: 。 谢谢阅读,款待我们交换~~

2、踏向fang文件夹,实施运行spider爬虫文件代码,编写爬虫文件。

1 scrapy genspider zufang "zu.fang.com"

  命令实行完,用Python最好的IDE---pycharm展开该文件目录

3、编写该目录下的items.py文件,设置你供给爬取的字段。

 1 import scrapy 2  3  4 class HomeproItem(scrapy.Item): 5     # define the fields for your item here like: 6     # name = scrapy.Field() 7  8     city = scrapy.Field()  #城市 9     title = scrapy.Field()  # 名字10     rentway = scrapy.Field()  # 出租方式11     price = scrapy.Field()    #价格12     housetype = scrapy.Field()  # 户型13     area = scrapy.Field()  # 面积14     address = scrapy.Field()  # 地址15     traffic = scrapy.Field()  # 交通

4、步向spiders文件夹,张开hr.py文件,初阶编写制定爬虫文件

 1 # -*- coding: utf-8 -*- 2 import scrapy 3 from homepro.items import HomeproItem 4 from scrapy_redis.spiders import RedisCrawlSpider 5 # scrapy.Spider 6 class HomeSpider(RedisCrawlSpider): 7     name = 'home' 8     allowed_domains = ['zu.fang.com'] 9     # start_urls = ['http://zu.fang.com/cities.aspx']10     11     redis_key = 'homespider:start_urls'12     def parse(self, response):13         hrefs = response.xpath('//div[@]/ul/li/a/@href').extract()14         for href in hrefs:15             href = 'http:'  href16             yield scrapy.Request(url=href,callback=self.parse_city,dont_filter=True)17 18 19     def parse_city(self, response):20         page_num = response.xpath('//div[@]/span[@]/text()').extract()[0].strip('共页')21         # print('*' * 100)22         # print23         # print(response.url)24 25         for page in range(1, int):26             if page == 1:27                 url = response.url28             else:29                 url = response.url   'house/i%d' % (page   30)30             print('*' * 100)31             print32             yield scrapy.Request(url=url, callback=self.parse_houseinfo, dont_filter=True)33 34     def parse_houseinfo(self, response):35         divs = response.xpath('//dd[@]')36         for info in divs:37             city = info.xpath('//div[@]/a[2]/text()').extract()[0].rstrip("租房")38             title = info.xpath('.//p[@]/a/text()').extract()[0]39             rentway = info.xpath('.//p[@]/text()')[0].extract().replace(" ", '').lstrip('rn')40             housetype = info.xpath('.//p[@]/text()')[1].extract().replace(" ", '')41             area = info.xpath('.//p[@]/text()')[2].extract().replace(" ", '')42             addresses = info.xpath('.//p[@class ="gray6 mt12"]//span/text()').extract()43             address = '-'.join(i for i in addresses)44             try:45                 des = info.xpath('.//p[@class ="mt12"]//span/text()').extract()46                 traffic = '-'.join(i for i in des)47             except Exception as e:48                 traffic = "暂无详细信息"49 50             p_name = info.xpath('.//div[@class ="moreInfo"]/p/text()').extract()[0]51             p_price = info.xpath('.//div[@class ="moreInfo"]/p/span/text()').extract()[0]52             price = p_price   p_name53 54             item = HomeproItem()55             item['city'] = city56             item['title'] = title57             item['rentway'] = rentway58             item['price'] = price59             item['housetype'] = housetype60             item['area'] = area61             item['address'] = address62             item['traffic'] = traffic63             yield item

5、设置setting.py文件,配置scrapy运维的相关内容

 1 # 指定使用scrapy-redis的调度器 2 SCHEDULER = "scrapy_redis.scheduler.Scheduler" 3  4 # 指定使用scrapy-redis的去重 5 DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter' 6  7 # 指定排序爬取地址时使用的队列, 8 # 默认的 按优先级排序,由sorted set实现的一种非FIFO、LIFO方式。 9 SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.SpiderPriorityQueue'10 11 REDIS_HOST = '10.8.153.73'12 REDIS_PORT = 6379 13 # 是否在关闭时候保留原来的调度器和去重记录,True=保留,False=清空14 SCHEDULER_PERSIST = True                                            

6、然后把代码发给其余从属机器,分别运行.子程序redis链接主服务器redis。

1 redis-cli   -h  主服务器ip

7、主服务器先运维redis-server,再起步redis-cli

1 lpush homespider:start_urls   起始的url 

版权声明:本文由威尼斯人app发布于编程学习,转载请注明出处:Python爬虫与AI结合,营造论文接龙程序!