Table des matières
回复内容:
Maison développement back-end Tutoriel Python 如何用爬虫下载中国土地市场网的土地成交数据?

如何用爬虫下载中国土地市场网的土地成交数据?

Jun 06, 2016 pm 04:22 PM
default http

作为毕业狗想研究下土地出让方面的信息,需要每一笔的土地出让数据。想从中国土地市场网的土地成交结果公告(landchina.com/default.a)中点击每一笔土地如何用爬虫下载中国土地市场网的土地成交数据?,在跳转后的详细页面中下载“土地用途” “成交价格” “供地方式” “项目位置”等信息,如何用爬虫下载中国土地市场网的土地成交数据?由于共有100多万笔土地成交信息,手动查找是不可能了,想问下能不能用爬虫给下载下来?以及预计难度和耗费时间?跪谢各位。

回复内容:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

#!/usr/bin/env python

# -*- coding: utf-8 -*-

import requests

from bs4 import BeautifulSoup

import time

import random

import sys

 

 

def get_post_data(url, headers):

    # 访问一次网页,获取post需要的信息

    data = {

        'TAB_QuerySubmitSortData': '',

        'TAB_RowButtonActionControl': '',

    }

 

    try:

        req = requests.get(url, headers=headers)

    except Exception, e:

        print 'get baseurl failed, try again!', e

        sys.exit(1)

    try:

        soup = BeautifulSoup(req.text, "html.parser")

        TAB_QueryConditionItem = soup.find(

            'input', id="TAB_QueryConditionItem270").get('value')

        # print TAB_QueryConditionItem

        data['TAB_QueryConditionItem'] = TAB_QueryConditionItem

        TAB_QuerySortItemList = soup.find(

            'input', id="TAB_QuerySort0").get('value')

        # print TAB_QuerySortItemList

        data['TAB_QuerySortItemList'] = TAB_QuerySortItemList

        data['TAB_QuerySubmitOrderData'] = TAB_QuerySortItemList

        __EVENTVALIDATION = soup.find(

            'input', id='__EVENTVALIDATION').get('value')

        # print __EVENTVALIDATION

        data['__EVENTVALIDATION'] = __EVENTVALIDATION

        __VIEWSTATE = soup.find('input', id='__VIEWSTATE').get('value')

        # print __VIEWSTATE

        data['__VIEWSTATE'] = __VIEWSTATE

    except Exception, e:

        print 'get post data failed, try again!', e

        sys.exit(1)

 

    return data

 

 

def get_info(url, headers):

    req = requests.get(url, headers=headers)

    soup = BeautifulSoup(req.text, "html.parser")

 

    items = soup.find(

        'table', id="mainModuleContainer_1855_1856_ctl00_ctl00_p1_f1")

 

    # 所需信息组成字典

    info = {}

 

    # 行政区

    division = items.find(

        'span', id="mainModuleContainer_1855_1856_ctl00_ctl00_p1_f1_r1_c2_ctrl").get_text().encode('utf-8')

    info['XingZhengQu'] = division

 

    # 项目位置

 

    location = items.find(

        'span', id="mainModuleContainer_1855_1856_ctl00_ctl00_p1_f1_r16_c2_ctrl").get_text().encode('utf-8')

    info['XiangMuWeiZhi'] = location

 

    # 面积(公顷)

    square = items.find(

        'span', id="mainModuleContainer_1855_1856_ctl00_ctl00_p1_f1_r2_c2_ctrl").get_text().encode('utf-8')

    info['MianJi'] = square

 

    # 土地用途

    purpose = items.find(

        'span', id="mainModuleContainer_1855_1856_ctl00_ctl00_p1_f1_r3_c2_ctrl").get_text().encode('utf-8')

    info['TuDiYongTu'] = purpose

 

    # 供地方式

    source = items.find(

        'span', id="mainModuleContainer_1855_1856_ctl00_ctl00_p1_f1_r3_c4_ctrl").get_text().encode('utf-8')

    info['GongDiFangShi'] = source

 

    # 成交价格(万元)

    price = items.find(

        'span', id="mainModuleContainer_1855_1856_ctl00_ctl00_p1_f1_r20_c4_ctrl").get_text().encode('utf-8')

    info['ChengJiaoJiaGe'] = price

    # print info

    # 用唯一值的电子监管号当key, 所需信息当value的字典

    all_info = {}

    Key_ID = items.find(

        'span', id="mainModuleContainer_1855_1856_ctl00_ctl00_p1_f1_r1_c4_ctrl").get_text().encode('utf-8')

    all_info[Key_ID] = info

    return all_info

 

 

def get_pages(baseurl, headers, post_data, date):

    print 'date', date

    # 补全post data

    post_data['TAB_QuerySubmitConditionData'] = post_data[

        'TAB_QueryConditionItem'] + ':' + date

    page = 1

    while True:

        print '     page {0}'.format(page)

 

        # 休息一下,防止被网页识别为爬虫机器人

        time.sleep(random.random() * 3)

        post_data['TAB_QuerySubmitPagerData'] = str(page)

        req = requests.post(baseurl, data=post_data, headers=headers)

        # print req

        soup = BeautifulSoup(req.text, "html.parser")

        items = soup.find('table', id="TAB_contentTable").find_all(

            'tr', onmouseover=True)

        # print items

        for item in items:

            print item.find('td').get_text()

            link = item.find('a')

            if link:

                print item.find('a').text

                url = 'http://www.landchina.com/' + item.find('a').get('href')

                print get_info(url, headers)

            else:

                print 'no content, this ten days over'

                return

        break

        page += 1

 

 

if __name__ == "__main__":

    # time.time()

    baseurl = 'http://www.landchina.com/default.aspx?tabid=263'

    headers = {

        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.71 Safari/537.36',

        'Host': 'www.landchina.com'

    }

 

    post_data = (get_post_data(baseurl, headers))

    date = '2015-11-21~2015-11-30'

    get_pages(baseurl, headers, post_data, date)

Copier après la connexion
不请自来,知乎首答,同为大四毕业狗
之前帮老师爬过这个信息,从1995年-2015年有170多万条,算了下时间需要40多个小时才能爬完。我爬到2000年就没有继续爬了。当时写代码的时候刚学爬虫,不懂原理,发现这个网页点击下一页以及改变日期后,网址是不会变的,网址是不会变的,网址是不会变的Orz,对于新手来说根本不知道是为什么。后来就去找办法,学了点selenium,利用它来模拟浏览器操作,更改日期、点击下一页什么的都可以实现了。好处是简单粗暴,坏处是杀鸡用牛刀,占用了系统太多资源。再到后来,学会了一点抓包技术,知道了原来日期和换页都是通过post请求的。今天下午就把程序修改了一下,用post代替了原来的selenium。废话不说,上代码了。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

# -*- coding: gb18030 -*-

'landchina 爬起来!'

import requests

import csv

from bs4 import BeautifulSoup

import datetime

import re

import os

 

class Spider():

    def __init__(self):

        self.url='http://www.landchina.com/default.aspx?tabid=263'

        #这是用post要提交的数据

        self.postData={  'TAB_QueryConditionItem':'9f2c3acd-0256-4da2-a659-6949c4671a2a',

                         'TAB_QuerySortItemList':'282:False',

                         #日期

                         'TAB_QuerySubmitConditionData':'9f2c3acd-0256-4da2-a659-6949c4671a2a:'

                         'TAB_QuerySubmitOrderData':'282:False',

                          #第几页

                         'TAB_QuerySubmitPagerData':''}

        self.rowName=[u'行政区',u'电子监管号',u'项目名称',u'项目位置',u'面积(公顷)',u'土地来源',u'土地用途',u'供地方式',u'土地使用年限',u'行业分类',u'土地级别',u'成交价格(万元)',u'土地使用权人',u'约定容积率下限',u'约定容积率上限',u'约定交地时间',u'约定开工时间',u'约定竣工时间',u'实际开工时间',u'实际竣工时间',u'批准单位',u'合同签订日期']

        #这是要抓取的数据,我把除了分期约定那四项以外的都抓取了

        self.info=[  

                'mainModuleContainer_1855_1856_ctl00_ctl00_p1_f1_r1_c2_ctrl',#0

                'mainModuleContainer_1855_1856_ctl00_ctl00_p1_f1_r1_c4_ctrl',#1

                'mainModuleContainer_1855_1856_ctl00_ctl00_p1_f1_r17_c2_ctrl',#2

                'mainModuleContainer_1855_1856_ctl00_ctl00_p1_f1_r16_c2_ctrl',#3

                'mainModuleContainer_1855_1856_ctl00_ctl00_p1_f1_r2_c2_ctrl',#4

                'mainModuleContainer_1855_1856_ctl00_ctl00_p1_f1_r2_c4_ctrl',#5

                #这条信息是土地来源,抓取下来的是数字,它要经过换算得到土地来源,不重要,我就没弄了

                'mainModuleContainer_1855_1856_ctl00_ctl00_p1_f1_r3_c2_ctrl',#6 

                'mainModuleContainer_1855_1856_ctl00_ctl00_p1_f1_r3_c4_ctrl',#7

                'mainModuleContainer_1855_1856_ctl00_ctl00_p1_f1_r19_c2_ctrl', #8             

                'mainModuleContainer_1855_1856_ctl00_ctl00_p1_f1_r19_c4_ctrl',#9

                'mainModuleContainer_1855_1856_ctl00_ctl00_p1_f1_r20_c2_ctrl',#10

                'mainModuleContainer_1855_1856_ctl00_ctl00_p1_f1_r20_c4_ctrl',#11

##                'mainModuleContainer_1855_1856_ctl00_ctl00_p1_f3_r2_c1_0_ctrl',

##                'mainModuleContainer_1855_1856_ctl00_ctl00_p1_f3_r2_c2_0_ctrl',

##                'mainModuleContainer_1855_1856_ctl00_ctl00_p1_f3_r2_c3_0_ctrl',

##                'mainModuleContainer_1855_1856_ctl00_ctl00_p1_f3_r2_c4_0_ctrl',

                'mainModuleContainer_1855_1856_ctl00_ctl00_p1_f1_r9_c2_ctrl',#12

                'mainModuleContainer_1855_1856_ctl00_ctl00_p1_f2_r1_c2_ctrl',

                'mainModuleContainer_1855_1856_ctl00_ctl00_p1_f2_r1_c4_ctrl',

                'mainModuleContainer_1855_1856_ctl00_ctl00_p1_f1_r21_c4_ctrl',

                'mainModuleContainer_1855_1856_ctl00_ctl00_p1_f1_r22_c2',

                'mainModuleContainer_1855_1856_ctl00_ctl00_p1_f1_r22_c4_ctrl',

                'mainModuleContainer_1855_1856_ctl00_ctl00_p1_f1_r10_c2_ctrl',

                'mainModuleContainer_1855_1856_ctl00_ctl00_p1_f1_r10_c4_ctrl',               

                'mainModuleContainer_1855_1856_ctl00_ctl00_p1_f1_r14_c2_ctrl',

                'mainModuleContainer_1855_1856_ctl00_ctl00_p1_f1_r14_c4_ctrl']

#第一步

    def handleDate(self,year,month,day):

        #返回日期数据

        'return date format %Y-%m-%d'

        date=datetime.date(year,month,day)

#        print date.datetime.datetime.strftime('%Y-%m-%d')

        return date  #日期对象

    def timeDelta(self,year,month):

        #计算一个月有多少天

        date=datetime.date(year,month,1)

        try:   

            date2=datetime.date(date.year,date.month+1,date.day)

        except:

            date2=datetime.date(date.year+1,1,date.day) 

        dateDelta=(date2-date).days

        return dateDelta

         

    def getPageContent(self,pageNum,date):

        #指定日期和页数,打开对应网页,获取内容

        postData=self.postData.copy()

        #设置搜索日期

        queryDate=date.strftime('%Y-%m-%d')+'~'+date.strftime('%Y-%m-%d')

        postData['TAB_QuerySubmitConditionData']+=queryDate

        #设置页数

        postData['TAB_QuerySubmitPagerData']=str(pageNum)

        #请求网页

        r=requests.post(self.url,data=postData,timeout=30)

        r.encoding='gb18030'

        pageContent=r.text

#        f=open('content.html','w')

#        f.write(content.encode('gb18030'))

#        f.close()

        return pageContent

#第二步

    def getAllNum(self,date):

        #1无内容  2只有1页  3 1—200页  4 200页以上 

        firstContent=self.getPageContent(1,date)

        if u'没有检索到相关数据' in firstContent:

            print date,'have','0 page'

            return 0

        pattern=re.compile(u'<td.*?class="pager".*?>共(.*?)页.*?</td>')

        result=re.search(pattern,firstContent)

        if result==None:

            print date,'have','1 page'

            return 1

        if int(result.group(1))<=200:

            print date,'have',int(result.group(1)),'page'

            return int(result.group(1))

        else:

            print date,'have','200 page'

            return 200

#第三步

    def getLinks(self,pageNum,date):

        'get all links'

        pageContent=self.getPageContent(pageNum,date)

        links=[]

        pattern=re.compile(u'<a.*?href="default.aspx.*?tabid=386(.*?)".*?>',re.S)

        results=re.findall(pattern,pageContent)

        for result in results:

            links.append('http://www.landchina.com/default.aspx?tabid=386'+result)

        return links 

    def getAllLinks(self,allNum,date):

        pageNum=1

        allLinks=[]

        while pageNum<=allNum:

            links=self.getLinks(pageNum,date)

            allLinks+=links

            print 'scrapy link from page',pageNum,'/',allNum

            pageNum+=1

        print date,'have',len(allLinks),'link'

        return allLinks

#第四步

    def getLinkContent(self,link):

        'open the link to get the linkContent'

        r=requests.get(link,timeout=30)

        r.encoding='gb18030'

        linkContent=r.text

#        f=open('linkContent.html','w')

#        f.write(linkContent.encode('gb18030'))

#        f.close()

        return linkContent

    def getInfo(self,linkContent):

        "get every item's info"

        data=[]

        soup=BeautifulSoup(linkContent)

        for item in self.info:

            if soup.find(id=item)==None:

                s=''

            else:

                s=soup.find(id=item).string

                if s==None:

                    s=''               

            data.append(unicode(s.strip()))

        return data

    def saveInfo(self,data,date):

        fileName= 'landchina/'+datetime.datetime.strftime(date,'%Y')+'/'+datetime.datetime.strftime(date,'%m')+'/'+datetime.datetime.strftime(date,'%d')+'.csv'

        if os.path.exists(fileName):

            mode='ab'

        else:

            mode='wb'

        csvfile=file(fileName,mode)

        writer=csv.writer(csvfile)

        if mode=='wb':

            writer.writerow([name.encode('gb18030') for name in self.rowName])

        writer.writerow([d.encode('gb18030') for d in data])

        csvfile.close()   

    def mkdir(self,date):

        #创建目录

        path = 'landchina/'+datetime.datetime.strftime(date,'%Y')+'/'+datetime.datetime.strftime(date,'%m')

        isExists=os.path.exists(path)

        if not isExists:

            os.makedirs(path)

    def saveAllInfo(self,allLinks,date):

        for (i,link) in enumerate(allLinks):

            linkContent=data=None

            linkContent=self.getLinkContent(link)

            data=self.getInfo(linkContent)

            self.mkdir(date)

            self.saveInfo(data,date)

            print 'save info from link',i+1,'/',len(allLinks)

Copier après la connexion
你可以去神箭手云爬虫开发平台看看。在云上简单几行js就可以实现爬虫,如果这都懒得做也可以联系官方进行定制,任何网站都可以爬,总之是个很方便的爬虫基础设施平台。 这个结构化如此清晰的数据,要采集这个数据是很容易的。 通过多年的数据处理经验,可以给你以下几个建议:

1. 多线程
2. 防止封IP
3. 用Mongdb存储大型非结构化数据

了解更多可以访问探码科技大数据介绍页面:tanmer.com/bigdata 我抓过这个网站的结束合同,还是比较好抓的。抓完生成表格,注意的就是选择栏的异步地区等内容,需要对他的js下载下来队形异步请求。提交数据即可。请求的时候在他的主页有一个id。好像是这么个东西,去年做的,记不清了,我有源码可以给你分享。用java写的 我是爬虫小白,请教下,不是说不能爬取asp的页面吗?
详细内容页的地址是”default.aspx?tabid=386&comname=default&wmguid=75c725。。。“,网站是在default.aspx页读取数据库显示详细信息,不是说读不到数据库里的数据吗?
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Que signifie le code d'état http 520 ? Que signifie le code d'état http 520 ? Oct 13, 2023 pm 03:11 PM

Le code d'état HTTP 520 signifie que le serveur a rencontré une erreur inconnue lors du traitement de la demande et ne peut pas fournir d'informations plus spécifiques. Utilisé pour indiquer qu'une erreur inconnue s'est produite lorsque le serveur traitait la demande, ce qui peut être dû à des problèmes de configuration du serveur, à des problèmes de réseau ou à d'autres raisons inconnues. Cela est généralement dû à des problèmes de configuration du serveur, des problèmes de réseau, une surcharge du serveur ou des erreurs de codage. Si vous rencontrez une erreur de code d'état 520, il est préférable de contacter l'administrateur du site Web ou l'équipe d'assistance technique pour plus d'informations et d'assistance.

Qu'est-ce que le code d'état http 403 ? Qu'est-ce que le code d'état http 403 ? Oct 07, 2023 pm 02:04 PM

Le code d'état HTTP 403 signifie que le serveur a rejeté la demande du client. La solution au code d'état http 403 est la suivante : 1. Vérifiez les informations d'authentification. Si le serveur requiert une authentification, assurez-vous que les informations d'identification correctes sont fournies ; 2. Vérifiez les restrictions d'adresse IP. Si le serveur a restreint l'adresse IP, assurez-vous que les informations d'identification sont correctes. l'adresse IP du client est restreinte. Sur liste blanche ou non sur liste noire ; 3. Vérifiez les paramètres d'autorisation du fichier. Si le code d'état 403 est lié aux paramètres d'autorisation du fichier ou du répertoire, assurez-vous que le client dispose des autorisations suffisantes pour accéder à ces fichiers ou répertoires. etc.

Comprendre les scénarios d'application courants de redirection de pages Web et comprendre le code d'état HTTP 301 Comprendre les scénarios d'application courants de redirection de pages Web et comprendre le code d'état HTTP 301 Feb 18, 2024 pm 08:41 PM

Comprendre la signification du code d'état HTTP 301 : scénarios d'application courants de redirection de pages Web Avec le développement rapide d'Internet, les exigences des utilisateurs en matière d'interaction avec les pages Web sont de plus en plus élevées. Dans le domaine de la conception Web, la redirection de pages Web est une technologie courante et importante, mise en œuvre via le code d'état HTTP 301. Cet article explorera la signification du code d'état HTTP 301 et les scénarios d'application courants dans la redirection de pages Web. Le code d'état HTTP 301 fait référence à une redirection permanente (PermanentRedirect). Lorsque le serveur reçoit le message du client

Comment utiliser Nginx Proxy Manager pour implémenter le saut automatique de HTTP à HTTPS Comment utiliser Nginx Proxy Manager pour implémenter le saut automatique de HTTP à HTTPS Sep 26, 2023 am 11:19 AM

Comment utiliser NginxProxyManager pour implémenter le saut automatique de HTTP à HTTPS Avec le développement d'Internet, de plus en plus de sites Web commencent à utiliser le protocole HTTPS pour crypter la transmission des données afin d'améliorer la sécurité des données et la protection de la vie privée des utilisateurs. Le protocole HTTPS nécessitant la prise en charge d'un certificat SSL, un certain support technique est requis lors du déploiement du protocole HTTPS. Nginx est un serveur HTTP et un serveur proxy inverse puissants et couramment utilisés, et NginxProxy

Envoyer une requête POST avec les données du formulaire à l'aide de la fonction http.PostForm Envoyer une requête POST avec les données du formulaire à l'aide de la fonction http.PostForm Jul 25, 2023 pm 10:51 PM

Utilisez la fonction http.PostForm pour envoyer une requête POST avec des données de formulaire. Dans le package http du langage Go, vous pouvez utiliser la fonction http.PostForm pour envoyer une requête POST avec des données de formulaire. Le prototype de la fonction http.PostForm est le suivant : funcPostForm(urlstring,dataurl.Values)(resp*http.Response,errerror)where, u

HTTP 200 OK : comprendre la signification et le but d'une réponse réussie HTTP 200 OK : comprendre la signification et le but d'une réponse réussie Dec 26, 2023 am 10:25 AM

Code d'état HTTP 200 : explorez la signification et l'utilisation des réponses réussies Les codes d'état HTTP sont des codes numériques utilisés pour indiquer l'état de la réponse d'un serveur. Parmi eux, le code d'état 200 indique que la demande a été traitée avec succès par le serveur. Cet article explorera la signification spécifique et l'utilisation du code d'état HTTP 200. Tout d’abord, comprenons la classification des codes d’état HTTP. Les codes d'état sont divisés en cinq catégories, à savoir 1xx, 2xx, 3xx, 4xx et 5xx. Parmi eux, 2xx indique une réponse réussie. Et 200 est le code d'état le plus courant dans 2xx

Application rapide : analyse de cas de développement pratique du téléchargement HTTP asynchrone PHP de plusieurs fichiers Application rapide : analyse de cas de développement pratique du téléchargement HTTP asynchrone PHP de plusieurs fichiers Sep 12, 2023 pm 01:15 PM

Application rapide : analyse de cas de développement pratique de PHP Téléchargement HTTP asynchrone de plusieurs fichiers Avec le développement d'Internet, la fonction de téléchargement de fichiers est devenue l'un des besoins fondamentaux de nombreux sites Web et applications. Pour les scénarios dans lesquels plusieurs fichiers doivent être téléchargés en même temps, la méthode de téléchargement synchrone traditionnelle est souvent inefficace et prend du temps. Pour cette raison, utiliser PHP pour télécharger plusieurs fichiers de manière asynchrone via HTTP est devenu une solution de plus en plus courante. Cet article analysera en détail comment utiliser le HTTP asynchrone PHP à travers un cas de développement réel.

Problèmes et solutions courants en matière de communication et de sécurité réseau en C# Problèmes et solutions courants en matière de communication et de sécurité réseau en C# Oct 09, 2023 pm 09:21 PM

Problèmes courants de communication réseau et de sécurité et solutions en C# À l'ère d'Internet d'aujourd'hui, la communication réseau est devenue un élément indispensable du développement logiciel. En C#, nous rencontrons généralement certains problèmes de communication réseau, tels que la sécurité de la transmission des données, la stabilité de la connexion réseau, etc. Cet article abordera en détail les problèmes courants de communication réseau et de sécurité en C# et fournira les solutions correspondantes et des exemples de code. 1. Problèmes de communication réseau Interruption de la connexion réseau : pendant le processus de communication réseau, la connexion réseau peut être interrompue, ce qui peut entraîner

See all articles